28 May

WSDL Soap Web Servis Karmaşası

Bu konu üzerine bir iki yazım oldu. Ama gelen aramalardan ve sorulardan görebildiğim kadarı ile çok fazla karmaşa hakim. Olayı basite indirgemek için tüm terimleri özetlemeye çalışacağım.
Web Servis : Farklı veya aynı platformlar arasında; örneğin php ile yazılmış web uygulamanızın asp.net uygulaması ile iletişim kurabilmesi web servis ile mümkündür.
İki farklı dil, iki farklı platform. Peki iletişim nasıl mümkün olacak. Her ikisinin de aynı dili konuşmasını nasıl sağlayacağız.
Burada devreye SOAP girmektedir. Açılımı “Simple Object Access Protocol” dur. SOAP’ı bir kurallar bütünü olarak tanımlayabiliriz. PHP ile ASP.NET’in konuşabilmesi için SOAP’ın koyduğu kurallara uygun hareket etmeleri gerekiyor. Bu kuralları burada açmayacağım, amacım sadece kavram karmaşasını bir nebze azaltmak.

SOAP’ı kurallar bütünü olarak tanımladık, bu kuralların yazılı olması gerekiyor ki kalıcı olsun 🙂 İşte bu yazılı kurallara da WSDL diyebiliriz. WSDL iki platform arasında iletişimi SOAP protokolü ile sağlar. SOAP protokolüne uygun olarak, gönderilecek komutların tanımlanmasını da WSDL sağlar.

WSDL alan istemci (client) , hanki interface’e sahip olduğunu. Bu interface’de hangi fonksiyon ve metodları bulunduğunu bilir ve buna göre karşı tarafa istek yapabilir.

1
$istemci= new SoapClient("http://sunucu.com/kurallar.wsdl");

Yukarıdaki satırın yorumu şudur : Gidip sunucu.com dan wsdl dosyasını al ve yönergelere göre kullandığım dile uygun hale getir. Eğer wsdl içerisinde listele gibi bir metod tanımlanmış ise :

1
$istemci->listele();

Şeklinde kullanabilirsiniz. WSDL ile hangi metodların,fonksyionların olduğu. Hangi parametreleri alabileceği, parametrelerin tipleri. Zorunlu olup olmadıkları gibi kuralları WSDL ile belirlersiniz. Bu belirlenen kurallar sunucu ve istemi tarafında yorumlanarak iletişim sağlanır.

Webden aşina olduğumuz HTTP bir protokoldür ve bu protokole göre browser ile sunucu anlaşmasını sağlar. Browserın neyi nasıl görüntüleyeceğini de HTML ile belirleriz.
SOAP ile WSDL bağlantısı da bu şekildedir. SOAP iletişimin nasıl yapılacağını belirten protokol, WSDL de iletişim kuracak sistemlerin nasıl davranmaları gerektiğini tanımlayan kural listesidir.

Web servis, SOAP ve WSDL kavramlarını bu düzleme indirdikten sonra ayrıntılandırırsanız anlaşılması daha kolay olur diye düşünüyorum.

Peki , html çok kolay oluşturuluyor ve Html yorumlamayı browser yapıyor. Ben WSDL’i nasıl oluşturacağım ve SoapClient’a nasıl yorumlatacağım 🙁

Web servis iletişiminde WSDL birkez oluşturulur ve gerekmedikçe değiştirilmez ve sadece hizmeti verecek taraf, yani server tarafı sorumludur bu işten. Genelde WSDL’i elle oluşturmak için kurduğunuz server tarafının otomatik olarak üretilmesini sağlayacak araçlar kullanılır. WSDL’i elle sıfırdan oluşturmak karmaşıktır.
Bu yüzden istemci tarafından bakarak, istemci tarafnda bize ne gibi bir görev düştüğüne bakalım.

Size web servis ile iletişim kuracağınız ve WSDL adresi verildiğinde “eyvah, ben ne yapacağım!” demenize gerek yok. İlk yapmanız gereken, mümkünse web servisi yazan kişi-kurum ile iletişim kurarak döküman rica etmeniz. Çünkü WSDL kuralları okunabilen , kısmen okunduğu kısmı ile anlaşılabilen bir yapıya sahip olsa da, hangi fonksiyonu ne zaman nerede kullanacağınızı ancak dökümantasyondan öğrenebilirsiniz.

İstemci tarafısınız, WSDL’i ve dökümanı aldınız, okudunuz ve anladınız. Bundan sonra yapmanız gereken tek şey SoapClient nesnesine gerekli parametreleri vererek istediğiniz şeyleri yapmasını sağlamanız :

1
2
3
 $client = new SoapClient("http://test-sunucusu.com/komut-tanimlamalari.wsdl"); // wsdl dosya isimlendirmesi tamamen uydurmadır, bir zorunluluk yoktur isimlendirmede
$parametre = array("a"=>1,"b"=>2);
$client->buFonksiyonWsdlDeTanımlı($parametre);

Yukarıdaki örnekde WSDL içerisinde buFonksiyonWsdlDeTanımlı diye bir fonksiyon olduğunu, bu fonksiyonunda bir array aldığını anlıyoruz.

Umarım daha fazla kavram karmaşasına sebep olmamışımdır.
Sorularınız için konu altına yorum bırakabilirsiniz.

24 Apr

WSDL’i nasıl okuyabiliriz

Bir WSDL dosyasının nasıl oluşturulabileceğine dair bir örnek vermek istiyordum, ama önce bir WSDL dosyasını okumayı göstermek daha iyi olur diye düşündüm.
Kendi oluşturduğum, oldukça basit bir WSDL dosyasını sizinle paylaşacağım ve bu WSDL yardımı ile konu üzerinde fikir edindirmeye çalışacağım. Ayrıca önceki yazıyı okuyarak bir fikir sahibi olabilirsiniz.

WSDL dosyamızı oluşturabilmek için Eclipse kullandım. Eclipse gerçekten çok başarılı bir geliştirme ortamı sunuyor. Hangi aracı kullanır iseniz kullanın, bilgisayarınızda mutlaka Eclipse bulundurun.

Şimdi geçelim WSDL dosyamıza. Aşağıdaki resimde görülebileceği gibi çok basit bir WSDL oluşturduk ( WSDL oluşturmaya daha sonra değineceğim )

Buradaki web servis çok basit . EchoTest adında bir metodu mevcut. Bu metod string tipinde ad,soyad ve mesaj diye parametreler almakta ve birde string tipinde sonuç döndürmekte. Bütün bunları Eclipse yardımı ile görebiliyoruz.

Adım adım gidersek :

İlk önce WSDL dosyamızı Eclipse ile açtık (Eclipse’in WSDL editor desteği olmalı veya sonradan aktif edilmelidir). Dosyayı açtığımızda yukarıdaki gibi bir yapı ile karşılaşırız.

Burada birçok alan mevcut, eğer başka bir WSDL açarsanız muhtemelen çok daha fazla alan ile karşılaşacaksınızdır.

NewPort yazan alanın altındaki değer, servis çağrılarının yapılacağı adrestir (EndpointURI) . Yani yaptığınız her SOAP çağrısı bu adrese yapılır.

TestServisi yazan alan servisimizin kendisidir.

EchoTest servisimize ait bir metoddur. Burada input ve output alanları görmekteyiz.

İnput alanı metodun aldığı parametreleri ve parametre tiplerini tutar.
Output ise metodun döndüreceği sonucu ve tipini tutar.

Bu servisin çağrımı aşağıdaki gibi olur

1
2
$istemci=new SoapClient('test.wsdl'); // böyle bir wsdlimiz olduğunu varsayıyorum
echo $istemci->EchoTest('Ersin','DOGAN','Merhaba Dunya');

Servisin çalışan şeklini burada göstermek istiyordum, ama hosting firmamın anlamadığım bir stratejisinden dolayı SOAP devredışı bırakılmış. Bu yüzden örneğin çalışabilir halini burada veremiyorum.

Son olarak bu servisin sunucu tarafını vererek noktalayalım :

1
2
3
4
5
6
7
8
class TestServisi {
   public function EchoTest($ad,$soyad,$mesaj){
      return 'Merhaba '.$ad.' '.$soyad.' Mesajınız: '.$mesaj.' alındı';
   }
}
$server=new SoapServer('test.wsdl');
$server->setClass('TestServisi');
$server->handle();

Sunucu tarafında da istemci tarafında da aynı wsdl kullanılır. Çünkü wsdl’in temel amacı budur. Yani ortak bir yapı kurarak servisler arası iletişimi sağlamak.

İstemci wsdl dosyasına bakarak hangi metodu nasıl , ne parametreler ile çağıracağını ne sonuç döneceğini bilir.
Sunucu ise hangi servisi çalıştıracağını ve ne sonuç döndüreceğini wsdl yardımı ile bilir.

Bu konuda yazacağım şimdilik bu kadar. Anlaşılmaz , eksik veya hatalı yer var ise yorum düşebilirseniz ilgilenirim.

Güzel günler dileği ile.

Not : WSDL dosyasına buradan ulaşabilirsiniz.