PHP ile web services geliştirme
Posted on 28 Ekim 2009 in Programlama by admin
Web services teknolojisi çok ilginç ve bir o kadar da kullanışlı bir teknoloji. Epeydir c++ ile web services geliştirme üzerinde uğraşıyorum. Bu yazımda da php ile client-server tarzında bir web services iletişiminin nasıl olacağı üzerinde bir örnek vereceğim. Bir sonraki yazımda ise gsoap kullanarak C++ ile yazılmış bir istemci ve WSDL+PHP ikilisini kullanan bir sunucu yazılımını yazmayı düşünüyorum. Çok basit olarak belirtmek gerekirse istemci programlar veya sunucular http protokolü üzerinden servera önceden belirlenmiş fonksiyonlar aracılığıyla belirtilen parametreleri sağlayarak iletişimde bulunurlar. İletişim xml formatında verilerin gönderilmesi-alınması ilkesine dayanıyor. Örnek vermek gerekirse iki sunucu düşünün. Birincisi anlık dolar kurunu istekte bulunan sunuculara gönderiyor, diğeri ise bu sunucuya o anki dolar kurununun ne olduğunu soruyor vb. İnterface sunucu üzerinde tanımlandığı için sunucu üzerinde kod güncellemesinin yapılması yeterli olacaktır. Örneğini vereceğim kod üç parçadan oluşuyor. Server-Client-WSDL dosyası. WSDL dosyası server ve client arasında bir köprü görevi görmektedir. Hangi fonksiyonların hangi parametrelerle çağırılabileceği bilgisini istemci tarafa bildirir. WSDL dosyasının oluşturulması için çeşitli programları (Netbeans gibi) webde bulabilirsiniz.
Aşağıdaki sunucu tarafına ait kaynak kodunda NewOperation fonksiyonu kendisine gelen karakter dizisine göre bir eşleme yapmakta ve eşleşen değeri geri göndermektedir.
98.42,
"microsoft" => 24.42);
function NewOperation($symbol) {
if (isset($this->quotes[$symbol])) {
return $this->quotes[$symbol];
} else {
throw new SoapFault("Server","Unknown Symbol '$symbol'.");
}
}
}
$server = new SoapServer("stockquote.wsdl");
$server->setClass("QuoteService");
$server->handle();
?>
Aşağıdaki istemci tarafına ait kaynak kodunda NewOperation fonksiyonuna parametre olarak karakter dizisi gönderilmekte ve cevabın server tarafından gönderilmesi beklenmektedir. \n";
\n";
print($client->NewOperation("ibm"));
echo "\n";
print($client->NewOperation("microsoft"));
echo "\n
} catch (SoapFault $exception) {
echo $exception;
}
?>
Aşağıdaki WSDL kaynak kodunda ise iletişimde kullanılan fonksiyonların aldığı parametreler ve dönüş veri tipi belirtilmektedir. WSDL dosyası hem sunucu hem de istemci tarafından kullanılmaktadır.
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns="http://www.example.org/StockQuote/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="StockQuote" targetNamespace="http://www.example.org/StockQuote/"> <wsdl:message name="NewOperationRequest"> <wsdl:part name="NewOperationRequest" type="xsd:string"/> </wsdl:message> <wsdl:message name="NewOperationResponse"> <wsdl:part name="NewOperationResponse" type="xsd:float"/> </wsdl:message> <wsdl:portType name="StockQuote"> <wsdl:operation name="NewOperation"> <wsdl:input message="NewOperationRequest"/> <wsdl:output message="NewOperationResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="StockQuoteSOAP" type="StockQuote"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="NewOperation"> <soap:operation soapAction="http://www.example.org/StockQuote/NewOperation"/> <wsdl:input> <soap:body namespace="http://www.example.org/StockQuote/" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://www.example.org/StockQuote/" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="StockQuote"> <wsdl:port binding="StockQuoteSOAP" name="StockQuoteSOAP"> <soap:address location="http://localhost/stock4/server2.php"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
Bu yazıda anlatılan kaynak kodlarını denerken WSDL dosyasında yer alan
<soap:address location="http://localhost/stock4/server2.php"/>
satırını değiştirmeyi unutmayınız.