16 Aug

Var Olan Bir Web Servisi Kullanmak

Daha önceki konularda , genel olarak WSDL yapısını anlatmaya çalıştım. WSDL’i nasıl kullanacağımıza dair bir örnek de verdim. Gene WSDL kullanımına dair bir örnek vereceğim, yalnız bu sefer biz sadece istemci tarafı olacağız.

Mevcut bir web servis ile iletişim kurmamız gerekiyor, bize WSDL adresi verildi, gerekli dökümanın da verildiğini varsayarak örneğimize geçelim.

Örneğimizdeki WSDL , kendisine verilen alan adının kime ait olduğunu söylemekte. Yani basit bir WHOIS sorgusu yapan bir web servis. Bu web servis, WebserviceX.Net adlı bir site tarafından Asp.Net kullanılarak hazırlanmış ( http://www.webservicex.net/whois.asmx?wsdl ). Biz de WSDL aracılığı ile Asp.Net de yazılmış bu servisi kullanacağız.

Tabi öncelikle WSDL i eclipse aracılığı ile açıyoruz, böylece hangi metodların olduğunu ve ne gibi parametreler aldığını, ne sonuç döndüreceğiniz görebileceğiz.

wsdl örnek

Yukarıdaki kalabalık kafanızı karıştırmasın. Bize gerekli olan alan, renkli olarak işaretlenmiş alan. Burada GetWhoIs adında bir metodun olduğunu ve cevap olarak GetWhoIsResponse tipinde bir veri dönderdiğini görüyoruz.

GetWhoIs metodu parametre olarak GetWhoIs tipinde bir veri almakta. Aşağıda, WSDL için gerekli sınınıfı oluşturdum :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class GetWhoIS {
   public $HostName;
   public function __construct($host){
      $this->HostName=$host;
   }
}

$parametre = new GetWhoIS('ersindogan.com');
$istemci=new SoapClient('http://www.webservicex.net/whois.asmx?wsdl',array('trace'=>1));
try {    
$sonuc = $istemci->GetWhoIS($parametre);
echo '<xmp><pre>',print_r($sonuc,true),'</pre></xmp>';
}catch(Exception $e){
echo $e->getMessage();
}

Görüldüğü gibi, öyle karmaşık işlemler yapmadan, birkaç adımda, kolayca, web servisimizi kullanabilir biçimde kodumuzu oluşturabiliyoruz. Uğraşmamız greken herhangi bir XML kodu yok,web servisin hangi dil ile oluşturulmuş olduğunun önemi yok, sanki kendi oluşturduğumuz bir classmış gibi kolaylıkla kullanabiliyoruz.

Bu örnekte metod adı (GetWhoIs) ile aldığı parametrenin adı aynı, bu kafanızı karıştırmasın. Yukarıdaki oluşturduğum class , web servisde bulunan metodun aldığı parametredir.

Güzel günler dileği ile.

16 Aug

Eclipse ile WSDL Oluşturma

Web servis ile uğraşırken, en çok sıkıntı yaratan şey WSDL oluşturmak sanırım. En yalın hali ile XML den ibaret bir dosya olmasına rağmen , çok fazla ayrıntı olması bu işi zorlaştırıyor.

Ama,WSDL dosyasını HTML gibi , gerekli etiketleri kullanarak, bir yazı editörü ile oluşturabilmek de mümkün. Biz kolay yöntemi kullanarak , Eclipse yardımı ile WSDL dosyasını oluşturacağız.

Eclipse ile WSDL dosyasını oluşturabilmek için, yeni bir proje açarak veya var olan proje içerisinde
File -> New -> Other adımlarını takip ettiğimizde, karşımıza çıkan pencerede bulunan Web Services başlığı altındaki, WSDL File seçip “Next”e tıklayarak bir diğer adıma geçin.

Bu adımda WSDL dosyamıza bir ad vererek bir diğer adıma geçin.

Bu adımda bulunan “Target namespace” yazan alana, benzersiz bir url yazın (örnek için var olan kayıdı değiştirmeseniz de olur)

“Prefix” alanına da herhangi birşey yazabilirsiniz , örneğin “tns” yerine “orn” yazabilirsiniz.
Buradaki “Create WSDL skeleton” seçeneğinde bulunan işareti kaldırın, çünkü bize örnek bir WSDL oluşturmasını istemiyoruz, kendimiz sıfırdan oluşturacağız.

Bu işlemden sonra “Finish”e tıkladığımızda, bir kaç satır koddan oluşan bir sayfa gelir karşımıza. Bu sayfa “Source” ve “Design” olmak üzere iki bölüm vardır. Biz “Design” bölümünü kullanacağız, burası görsel olarak WSDL’i oluşturabileceğimiz bölümdür.

WSDL oluşturmaya geçmeden önce, web servisimizin ne olacağını ve ne görev yapacağını belirlemeliyiz. Böylece WSDL’imizi de bu yapılacak işlere göre oluşturacağız.

Web servisimiz bir stok servisi olsun, urun stok durumunu kontrol edebilen ve stoğu listeleyebilen , ürünün stok durumunu gösterebilen bir servisimiz olsun. Bu web servisde kullanılacak sınıfımız da aşağıdaki gibi olsun :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class StokYanit {
   public $mesaj;
   public $kod;
   public function __construct($mesaj,$kod){
      $this->mesaj=$mesaj;
      $this->kod=$kod;
   }
}
class Urun {
   public $id;
   public $ad;
   public $renk;
   
   public function __construct($id,$ad,$renk){
      $this->id=$id;
      $this->ad=$ad;
      $this->renk=$renk;
   }
}

class Stok {
   public function liste(){}
   public function kontrolEt(Urun $urun){
      return new StokYanit($urun->ad.' ürünüden x adet kalmıştır',100);
   }
}

Yukarıdaki kod sadece sistemin işleyişini anlatabilmek için oluşturuldu. Şimdi geçelim bu stok servisimizin WSDL’ini oluşturmaya.
Az önce bahsettiğim gibi , “Design” bölümünü kullanacağız. Design bölümüne tıkladığımızda karşımıza boş bir sayfa çıkacaktır. Bu sayfada bir alana sağ tıklayalım :

– Add Service
– Add Binding
– Add PortType

ve daha birkaç seçeneğin de olduğu bir menü çıkar. Bu menüden bu üç seçeneği yazdım, çünkü en çok kullanacağımız seçenekler bunlar.

Şimdi , yukarıdaki Class’ın WSDL’imizde karşılığını oluşturacağız. Böylece web servisimizi kullanarak sistemimizde stok işlemeleri yapılabilecek.

Add PortType bir port ekler, burada servisin yapısını oluşturmamızı sağlar (Bizim örneğimizde IStok, bu adlandırmayı rastgele yaptım) .

Add Service ile bir servis oluşturulur, servis çağrısının yapılacağı konumu belirtmemizi sağlar (endpointURI burada tanımlanır)

Add Binging ile de Service ve PortType arasında bağ kurulması sağlayan “Binding” nesnesi oluşturulur.

Burda en önemli ve en karmaşık olan bölüm “Add PortType”. Çünkü bu seçenek ile servisimizin yapısını oluştururuz.

Buraya kadar anlattıklarımı video olarak aşağıda bulabilirsiniz. Tek tek resim ekleyerek anlatmak uzun ve zor olacağından böyle bir yöntem seçtim. Yalnız ses problemini aşamadığım için videoda ses yok.

Videoyu izlemeye geçmeden önce yukarıda bulunan kodlardaki “Class”lara iyi bakın, çünkü WSDL de bu yapıyı kuracağız.

Eclipse ile WSDL oluşturma from Ersin DOĞAN on Vimeo.

Konu ile ilgili daha fazla bilgi vermek gerek, yalnız ayrıntı fazla olduğu için , konuyu dağıtmadan nasıl tamamlayabileceğimi bilemediğim için, yazıyı burada kesiyorum. Aklınıza takılan şeyleri burda yorum olarak yazarsanız, konun devamını yorumlardan sürdürebiliriz.

Güzel günler dileği ile.

08 Aug

Web servislerinde hata ayıklama

“looks like we got no XML document” hatasını aldığımızda , öylesine kalakalırız ilk başlarda. Çünkü web servisin çalışması için gerekli kodları yazmış ve gerekli ayarlamaları yapmıştık. Neden çalışmıyor ki bu meret, yok mu bunun neden çalışmadığını anlamanın yolu. Var tabiki.

Gönderilen her SOAP çağrısını (SOAP Request) ve cevabını (SOAP Response) izleyebiliriz. Bunun için yapmamız gereken yaptığımız çağrıyı try catch bloğu içerisine yazarak, hata olduğu zaman dönen cevabı yazdırmak.

Daha önceki yazıda verdiğim örnekten yola çıkarak anlatmaya çalışayım.

Sunucu tarafını burda vermeyeceğim, çünkü daha önceki yazıda mevcut. Şimdi istemci tarafındaki kodu yazalım :

1
2
3
4
5
6
7
8
9
10
11
$istemci=new SoapClient(null,
                  array('uri'=>'http://ersindogan-testuri',
                 'location'=>'http://localhost/test/sunucu.php',
                  'trace'=>1));
try {
var_dump($istemci->gonder('mesaj','konu','kime'));
}catch(Exception $e){
 echo '<xmp><pre>',
        print_r($istemci->__getLastResponse(),true),
        '</pre></xmp>';
}

Eski örneğe eklediğimiz iki farklı şey var :
Biri try-catch blogu içeirisine yazdık kodlarımızı.
İkinci olarak, hata olduğunda dönen cevabı yazdırarak sorunun nerde olduğunu anlamaya çalışıyoruz. Ayrıca unutmadan söyleyeyim, SOAP isteğinden dönen cevabı görebilmek için , SOAPClient nesnemizin kurucusuna parametre olarak “trace” anahtarını vererek, bunun açık olmasını sağlamalıyız. Aksi taktirde dönen cevabı ekrana bastırmaya kalktığımızda hiçbirşey göremeyiz.
Aynı durum “xmp” etiketi için de geçerli, eğer cevabımızı bu etiketler arasında yazdırmazsak , gene aynı biçimde dönen cevabı ekrana basmaya kalktığımızda hiçbirşey göremeyiz. “xmp” etiketi, w3c tarafından kullanımı önerilmeyen, kodları etkisizleştirerek salt metin biçiminde gösterilmesini sağlayan bir html etiketi. Her nekadar kullanılmaması önerilse de, bu tip hata ayıklama işlemlerinde çok yardımcı oluyor.

Web servisler üzerine birşeyler yazarken, hata ayıklamayı yazmayı unutmuşum. Bana gelen bir epostadan sonra , bu konu üzerinde birşeyler yazmak istedim. Umarım açıklayıcı yazabilmişimdir.

Güzel günler dileği ile…