WSDL Nedir?
WSDL, Web Services Description Language yani Web Servisleri Tanımlama Dili, web servislerinin ne olduğunu açıklayan bir XML biçimidir. Mesaj alışverişi yapabilen ağ servislerini tanımlayan bir XML dilbilgisidir.
WSDL, web servislerinin fonksiyonlarını, istek ve cevap yapılarını, olası hataların ne olduğunu, iletişim ve güvenlik gereksinimleri gibi öğelerin ne olduğunu tanımlar. Bundan dolayı tanımlama dili olarak geçer.
Web servisleri web uygulamalarının oluşmasında önemli bir bileşendir. Web servisinin temel amacı çeşitli programlama dilleri ile yazılmış uygulamaların birbirleriyle konuşmasına olanak sağlamasıdır. Web servisleri için önemli bir yeri olan WSDL ise web servislerinin tüm ayrıntılarını açıklayan, web servislerine erişim aracı olarak kullanılan XML tabanlı bir temsil dilidir.
WSDL Neden Kullanılır?
WSDL’nin amacı bir Web hizmetini soyut olarak belirtmek ve ardından WSDL geliştiricisinin bu hizmetlerin uygulanmasına nasıl ulaşacağını tanımlamaktır.
Bir web servisini kullanan başka bir servis veya uygulama bu web servisiyle ilgili tüm detayları, web servisinin ne olduğunu, bu web servisinin çeşitli bileşen ve işlevlerinin, parametrelerin neler olduğunu, geri dönüş türlerini ve web servisinin tam olarak nasıl kullanıldığını bilmelidir. Yani web servisini kullanacak başka servis veya uygulama kullanacağı servisin yapısını bilmesi gerekir. Bunun için web servisini sunan sistem servis hakkında bir açıklama yayınlar. Bunu da tüm özelliklerin ve işlevlerin açıklandığı web servisine ait XML tabanlı arayüzü olan WSDL ile yapar. Ayrıca burada sözü geçine servis tanımı SOAP altyapısı ile beraber tüm teknik ayrıntıları hem servisi kullanan uygulamadan hem de web servisinden izole eder.
Ayrıca web servislerinin diğer servisler ve uygulamalar tarafından servis kataloglarında keşfedilebilmesi ve kullanılması için tutarlı bir şekilde tanımlanması gerekir. XML schema tek başına web servisiyle iletişim için gerekli olan önemli ek ayrıntıları tanımlayamaz.
Bir başka nokta da web servislerinin açıklamaları makine tarafından da anlaşılabilen bir standart olduğu için özel programlamaları, entegrasyonları veya başka çalışmaları da azalttığı için WSDL’a ihtiyaç vardır.
WSDL’nin Genel Özellikleri
WSDL platformlardan ve programlama dillerinden bağımsızdır çünkü sonuçta o da bir XML dokümanıdır. Öncelikli olarak SOAP özellikli servisleri tanımlamak için kullanılır ancak sadece SOAP’a münhasır değildir. Bir URL’den yani ağ üzerinden elde edilenler online WSDL, dosya halinde olanlar ise offline WSDL olarak adlandırılır. Dosya biçimi “.wsdl” şeklindedir. URL’den çekebilmek için servis endpoint adresine “?wsdl” veya “.wsdl” eklenmesi ile ilgili adresten elde edebiliriz.
Bir WSDL dosyası tanımlayacağı servis için tam olarak aşağıdakileri tanımları sağlamalıdır:
- Servisin ne yaptığı: Bir web servisin sağladığı tüm fonksiyonları, bunların ihtiyaç duyduğu parametreleri ve her fonksiyonun işlem yaptıktan sonra sağladığı sonuçların biçimini özetleyen bir arabirim tanımı.
- Servis nasıl çağrıldığı: İstek ve yanıt mesajlarıyla paylaşılan verilerin biçimi ve yapısı.
- Servis nerede bulunduğu: Kullanılacak iletişim protokole ilişkin bilgiler.
Eksiksiz bir WSDL dokümanı, bir web servisi çağırmak için gerekli tüm bilgileri içerir!
WSDL’nin Genel Yapısı
WSDL dokümanı temel olarak iki farklı bölüme sahiptir:
- Service Arayüz Tanımı (service interface definition): Genel web servis arayüz yapısını tanımlar. Bu bölüm, servis tarafından desteklenen işlemleri, bu işlemlerle ilgili parametreleri ve soyut veri türlerini içerir.
- Servis Uygulama Kısmı (service implementation part): Soyut arayüzü somut bir ağ adresine, belirli bir protokole ve somut veri yapılarına bağlar.
WSDL’nin genel şeması şu şekildedir:
Bu iki bölümün birleşimi, servisi kullanacak uygulamaya web servisini nasıl çağıracağını ve web servisiyle nasıl etkileşimde bulunacağını açıklamak için yeterli bilgiyi içerir. Bir istek sahibi bu dokümanı kullanarak web servisi bulabilir ve açık olan fonksiyonlarından herhangi birini çağırabilir. Concrete ve abstract kısımlardaki öğelere ek olarak isteğe bağlı öğerler de bulunmaktadır. Tüm öğelerle sonraki bölümlerde daha da detaylandıralım.
WSDL Sürümleri
WSDL 1.1
1.0 versiyonun resmileştirilmiş halidir. W3C tarafından 2001 yılında yayımlanmıştır. W3C WSDL 1.1 adresinden detaylı inceleyebilirsiniz.
WSDL 2.0
W3C tarafından 2007 yılında yayımlanmıştır. W3C WSDL 2.0 adreslerinden inceleyebilirsiniz. Her iki versiyon için de Wikipedia WSDL adresinde geçmişi bulabilirsiniz.
WSDL 1.1
XML’ye ait temel söz dizimleri burada da geçerlidir. WSDL’in ayrıca bazı söz dizimi standartları vardır. WSDL 1.1’in kök öğesi <definitions> öğesidir.
WSDL 1.1’in Yapısını Oluşturan Elemanlar
WSDL dokümanı somut ve soyut öğelerden oluşur. Tüm bu öğeler <definitions> kök öğesinin altındadır. Kök öğe, XML giriş yazısında gördüğümüz üzere, burada da aynı şekilde tüm WSDL içeriğini kapsar. WSDL’yi oluşturan bu öğeleri teker teker açıklayalım:
Soyut – Arayüz (Abstract – Interface) Öğeleri
types: Kullanılan tüm primitive ve complex olarak bilinen veri türleri bu öğenin içinde bildirilir. WSDL, XML schema’nın (xsd) tanımladığı int, float, long, short, boolean gibi primitive veri türlerini kullanır. Geliştiriciler bunları doğrudan kullanabilir ya da bunları kullanarak oluşturdukları complex veri türlerini kullanmasına olanak tanır. Bu veri türleri message tanımlarında kullanılır. Eğer veri türü complex ise burada <types> öğesi kullanılmalıdır.
message: Bu öğe, servisle iletilecek mesajın yapısını açıklar. Message öğesi <part> öğelerinden oluşur. Bu <part> öğelerinin her biri <types> öğelerine bağlıdır. Özetle bu bölüm kullanılan tüm veri türlerini açıklar. RPC-style ve document-style olmak üzere iki farklı şekilde kullanılabilir.
portType ve operation: Bu öğeler, web servis arayüzünü ve web servis içinde açıklanan tüm dışarıya açılan fonksiyonları tanımlamak için kullanılır. Bir <portType> öğesi, bir web servisindeki <operations> öğelerinin mantıksal grubudur. Burada herhangi bir internet protokolü veya fiziksel adres belirtmeden web servisinin operasyonlarını yani metotlarını açıklar. <portType> öğesi, bir WSDL dokümanınn merkezinde yer alır; tanımdaki öğelerin geri kalanı esasen <portType> öğesinin bağlı olduğu ayrıntılardır. <operations> kısmı ise, servis tarafından sunulan metotları temsil eder; metotların adını, giriş ve çıkış parametrelerini içerir. Tipik bir <operation> öğesi, en fazla bir <input> ve <output> öğeleri ile istenen sayıda <fault> öğesinden oluşur.
<portType> öğesinin 4 farklı tipi vardır:
- One-way: İşlem bir mesaj alır ancak bir yanıt döndürmez sadece input tanımlıdır.
- Request/Response: İşlem bir istek alabilir ve bir yanıt döndürür. En yaygın kullanılan budur. Hem input hem output tanımlıdır.
- Solicit/Response: İşlem bir istek gönderebilir ve bir yanıt bekler.
- Notification: İşlem bir istek gönderebilir ve bir yanıt beklemez.
Somut – Uygulama (Concrete – Implementation) Öğeleri
binding: WSDL’nin servis implementasyon bölümü, <binding>, <port> ve <service> öğelerinden oluşur ve belirli bir servis arayüzünün servisi sağlayan (provider) tarafından nasıl uygulandığını açıklar. Bu bölümün merkezi öğesi <binding> öğesidir. Bu öğe, web servisi ile istek yapan arasında nasıl mesaj alışverişi yapılması gerektiğini belirtir. <binding> öğesi, <portType> ve <operation> öğelerini belirli bir protokole eşlemek için kullanılır.
port ve service: <port> öğesi web servisinin adresini tanımlar, bunun servisin bulunabileceği URL olarak düşünebiliriz. <port> birden fazla olabilir. <servis> öğesi ise <port> öğelerinden oluşur. <service> öğesi <binding> bölümünü burada tanımlanan internet adresine eşler.
Opsiyonel Öğeler
import: Diğer XML dokümanlarını referans olarak göstermek için kullanılır.
Örnek WSDL 1.1
Aşağıdaki WSDL, geçerli tarih ve saati bir dize olarak döndüren basit bir web servisi için oluşturulmuş bir WSDL dokümanıdır:
WSDL 2.0
Aynı şekilde XML söz dizimi geçerliliği ve abstract/concrete parçalar burada da geçerlidir. 1.1 versiyonunda kök öğe <definitions> şeklindeyken 2.0 versiyonunda kök öğe <description> şeklindedir. 2.0 versiyonundaki öğeleri de açıklayalım.
Soyut – Arayüz (Abstract – Interface) Öğeleri
types: <types> öğesi istemci ile web servisi arasında değiş tokuş edilen veri türlerini belirtir. Varsayılan olarak bu veri türleri XML schema (xsd) kullanılarak tanımlanır.
interface: <interface> öğesi, web servisinin hangi operasyonlara sahip olduğunu ve her işlem için hangi mesajların alınıp verildiğini açıklar. Ayrıca olası hata mesajlarını da açıklar.
Somut – Uygulama (Concrete – Implementation) Öğeleri:
binding: <binding> öğesi, web servisine ağ üzerinden nasıl erişildiğini açıklar. Genel olarak binding öğesi web servisini HTTP protokolüne bağlar.
endpoint ve service: <service öğesi>, web servisine ağ üzerinde nereden erişilebileceğini tanımlar. Genellikle bu öğe, servisin URL’sini içerir.
Opsiyonel Öğeler
import: <import> öğesi 1.1’de olduğu gibi aynı amaçla kullanılır. İçe aktarma öğesidir. İsteğe bağlı olarak XML schema veya başka WSDL dokümanları gibi diğer XML dokümanlarını referans göstererek içe aktarabiliriz.
documentation: <documentation> öğesi de isteğe bağlıdır. Web servisinin insan tarafından okunabilir bir tanımını içermek için kullanabiliriz.
Örnek WSDL 2.0
Hangi Sürüm Kullanılmalı? 2.0 ile Gelen Yenilikler
Her iki sürüm de W3C’nin ortaya çıkarmış olduğu tavsiye niteliğinde çıkarmış olduğu spesifikasyonlardır. Kullanılan tool, ürün veya uygulamalar desteklediği sürece ikisi de kullanılabilir. Ancak şu da unutulmamalıdır; WSDL 1.1 artık de facto standart olduğu için bir çok araç, ürün desteklemektedir.
2.0 versiyonuyla ilgili yapılan değişikliklerden sonra aralarında bazı farklılıklar bulunmaktadır. Bu farklılıkları da şu şekilde özetleyebiliriz:
»
2.0, WSDL 1.0/1.1’de bulunan birlikte çalışabilirlik (interoperability) sorunlarını çözmek için tasarlanmıştır.
»
2.0, işlemler arasında hataların yeniden kullanımını kolaylaştırmak için arabirim öğesi içinde hata mesajlarının bildirilmesine izin verir.
»
2.0, ek mesaj kalıpları için destek sağlar.
»
2.0, WSDL dosyası içinde parçaların daha net ve daha kolay yeniden kullanımına izin vererek daha iyi ve daha güçlü hata işleme gösterimi sağlar.
»
Söz dizimi olarak da; kök öğe olarak definitions yerine description, port yerine endpoint portType yerine interface gelmiştir. 1.1’de bulunan message öğesi de 2.0’da operation içerisinde kullanılmaktadır.