Web servisler modern internet döneminin XML mesajlaşma tabanlı entegrasyon yöntemi ya da diğer bir deyişle api’leridir. Web servis ile internet üzerinde herhangi bir platformdaki herhangi bir dille yazılmış bir uygulama ile veri alışverişi gerçekleştirebilriz. Örneğin bir siteniz var ve bu sitenizden kullanıcılarınız üyelik sistemiyle yararlanabiliyor. Bu sistemde kullanıcılarınıza SMS ile bilgi vermeye yarayan bir özellik aktif etmek istiyorsunuz. Ama bu servisi kontrol etmek elimizde değil; bu yüzden SMS servisini başka bir yerden alırız. Gerekli işlemleri kendi uygulamamızda gerçekleştirebilmemiz için bir API(Application Programming Interface – Uygulama Geliştirme Arayüzü) sunar. İşte bu API’lerin iletişim yöntemlerinden biride web servisleridir. Kısaca iki farklı uygulama arasında köprü görevi görmektedir.
Farklı platformlarımız var ve bunların birbirleri ile anlaşması gerekir. İşte bu noktada SOAP devreye girer. Şöyle ki PHP ile web servisi yazabilmek veya başka servislerle haberleşebilmek için dört ayrı kütüphane(protokol) mevcuttur. Bunlar OAuth, SCA, SOAP, XML-RPC. Burada üzerinde duracağım kısım SOAP standartıdır.
SOAP, web üzerinden fonksiyonları kullanmak için geliştirilmiş bri sistemin XML tabanlı kurallar topluluğudur. SOAP kullanarak nesne transferi yapmak için, herhangi bir XML web servisi oluşturulur. SOAP ve HTML birbirini tamamlayan iki teknolojidir. Bilindiği üzre HTML “hypertext” transfer etmek amacıyla oluşturulmuş bir yapıdır; nesne transfer edemez, bu eksikliği SOAP kapatmaktadır.
Bir web servisinin genel yapısı :
SOAP Server, gelen SOAP isteklerini karşılayıp önceden belirtilmiş olan fonksiyon ya da metodlara yönlendiren bir dosyadır. PHP Soap kütüphanesinde SOAPServer, SOAPClient, SOAPFault, SOAPHeader, SOAPParams, SOAPVar sınıfları bulunmaktadır.
SoapServer sınıfının yöntemleri :
SoapServer:: addFunction : Yazdığımız yöntemleri servise ekler. SOAP_FUNCTIONS_ALL ile bütün metotları ekleyebiliyoruz.
SoapServer:: construct : SoapServer Sınıfı’nın yapıcı yöntemi.
SoapServer:: getFunctions : Tanımlı yöntemlerin listesini döndürür.
SoapServer:: handle : Web Servisinin isteklere hazır halde bekletir.
SoapServer:: setClass : addFunction yönteminin benzeridir.
SoapClient sınıfının yöntemleri :
SoapClient::__call : soap sunucusundan tanımlı bir metota çağrı yapar. aldığı iki değer vardır birincisi metot ismi ikincisi gönderikecek değerler.
SoapClient::__getFunctions : Kullanılabilir metotların listesini
SoapClient::__getLastRequest : Son isteklerin döndürür.
SoapClient::__getLastResponse : Son gönderilen cevaplar.
WSDL ile web servisinin metodları ve adresleri belirtilir.
WSDL’in Temel Bileşenleri :
- 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.
NuSOAP, PHP web servislerinde SOAP’ın hızlı bir şekilde geliştirilmesine olanak sağlayan class kütüphanesidir. Basit object-oriented interface(nesne yönemli arayüz), service için WSDL dosyasını otomatik olarak yaratabilir ya a WSDL kullanmadan çalışabilir. PHP dosyaları içerisine (istemci ya da sunucu) import edilir .
require_once(‘lib/nusoap.php’);
Yaygın olarak basit tipler kullanılır. NuSOAP kütüphanesi Complex Types(kompleks tipler) ide destekler. Basit tipler xsd, kompleks türler için tns etiketi kullanılır. Ardışıl complex ya da basit/ilkel(primitive) tipler PHP de array veya struct lar kullanılarak oluşturulurlar. Şöyleki,
NuSOAP yapısını kullanarak bir örnek üzerinde inceleme yaparsak;
Öncelikle NuSOAP’a ait php dosyasını buradan indirebilirsiniz.
Bu projede kullanılan dizinler :
Kullanılan dizin yapısını kendi projenize göre değiştirebilirsiniz. Eğer bir değişiklik söz konusu ise burada dikkat etmeniz gereken SOAP istemci dosyasının dizin yapısını, SOAP server dosyası içerisinde de endpoint güncellemeniz gerekmektedir.
SOAP server dosyasının içeriği :
Burada $server SOAP server işlevselliği için özel bir değişkendir.
Bu satırlarda da servis fonksiyonu implement edilir.
function hello($parameters) {
. . .
return $result;
} SOAP girdileri doğrudan fonksiyon parametreleri olarak alır.
SOAP otomatik bir değer döner.
$HTTP_RAW_POST_DATA, XML SOAP isteklerini içermelidir.
$server->service satırı XML analizi yapar. Fonksiyon çağrıları yapar ve XML istekleri yaratır.
SOAP client dosyası :
İlk parametre bir web servis endpoint URL dir.
İkinci parametre false, WSDL’e ihtiyaç olmadığını belirtir.
$result = $client->call('hello', array('name' => 'symtkn'));
İlk parametre çağırılacak fonksiyonun ismi, ikinci parametre SOAP girdilerinin listesini tutan bir array.
Bu array “parametre ismi => parametre değeri” şeklinde key-value çiftleri halinde bulunur.
Localhost’unuzda client.php dosyası ile sunucuya http isteği (http://localhost/lotus/client.php) gönderirsek sunucu bize şöyle bir çıktı ile isteğimizi yanıtlar :
Hello, symtkn
Bu örnek projeyi yaparken karşılaştığım birkaç hata var; bunlarla eğer sizde karşılaşırsanız aşağıdaki adımları izleyebilirsiniz.
Projeyi çalıştırma aşamasında karşılaşabileceğiniz hatalar :
1-) Cannot load php_soap.dll
Çözüm : php.ini dosyasında extension=php_soap.dll satırını başındaki noktalı virgülü kaldırın ve tüm servisleri restart yapın.
Ve “PHP extentions” kısmından php_soap’, SOAP uzantısının (extention) etkinleştirilmiş olması gerekir.
2-) Warning: require_once(lib/nusoap.php) function.require-once: failed to open stream: No such file or directory in C:\wamp\www\lotus\client.php on line 4
Fatal error: require_once() function.require: Failed opening required ‘lib/nusoap.php’ (include_path=’C:\wamp\www\lotus \include/..;.;C:\php5\pear’) in C:\wamp\www\lotus\client.php on line 4
Php.ini dosyasında include_path = “.;c:\wamp\www" satırının başındaki noktalı virgülü kaldırarak restart yapın. Eğer eşitliğin sağ tarafı istenilen dizin yapısına uymuyorsa düzenleme yapabilirsiniz. Benim include edeceğim dosyalar www dizininin altında yer aldığı için bu yolu(path) yazdım.