Örnek bir soap web servis kodlandı. Bu web servis içerisinde basic authentication
tanımlandı.
Basic Authentication Bilgileri :
username : ornek password : ornek
Kodlanan web servise istemciler tarafında nasıl istek atılacağını aşağıda görebilirsiniz.
- Yapılan örnek çalışmaya ait wsdl dosyası : http://okesmez.com/php-soap-v2/server.php?wsdl
- Gönderilebilecek örnek bir request xml : http://okesmez.com/php-soap-v2/client.php?request
- Alınan örnek bir response xml : http://okesmez.com/php-soap-v2/client.php?response
- Örnek client.php kodları https://github.com/ofke-yazilim/php-soap-v2/blob/main/client.php
- Örnek client çıktısı : http://okesmez.com/php-soap-v2/client.php
Soap servisin oluşturulduğu: yani istemcilere cevap veren taraftır. Bir soap web servisine ait tüm
tanımlamarı içeren WSDL
dosyası server tarafında oluşturulmaktadır. Örnek bir WSDL dosyası aşağıdaki
bilgileri içermektedir.
- Web servise ait tanım bilgilerini içerir.
<definitions>
- Web servise ait veri türlerini içerir.
<types>
- Web servise ait girdi ve çıktı tanımlamalarını içerir.
<message>
- Web servisin işlevini içerir.
<portType>
- Web servise ait her bir port(işlev) için mesaj formatı ve protokol bilgilerini barındırır.
<binding>
Oluşturulacak olan xml dosyasının ilk etiketidir. Diğer etiketleri içerisinde barındırır. Etiket içerisinde
name
parametresi servise vermek istediğiniz ismi belirtir. targetNamespace
parametresi oluşturduğunuz bu wsdl
dosyasına ait http ya da https adresini içeririr. Örnek bir kullanım aşağıdaır.
<wsdl:definitions name="OrnekServisAd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://okesmez.com/php-soap-v2"
targetNamespace="http://okesmez.com/php-soap-v2">
</wsdl:definitions>
Servise ait girdi ve çıktı parametrelerine ait datatype değerlerini belirlemenizi sağlar. Aşağıda giriş değerini ve çıkış değerini object türünde olan bir tanımlama örneğini göreblirsiniz. Bir çok data tipi için input ve output tanımlayabilirsiniz. (int,float,string,double vb.)
<types>
<schema targetNamespace = "http://okesmez.com/php-soap-v2/ornek.xsd"
xmlns = "http://www.w3.org/2000/10/XMLSchema">
<element name = "ornekInput">
<complexType>
<all>
<element name = "getData" type = "object"/>
</all>
</complexType>
</element>
<element name = "ornekOutput">
<complexType>
<all>
<element name = "sendData" type = "object"/>
</all>
</complexType>
</element>
</schema>
</types>
Tanımlanan data tiplerine göre nasıl mesaj dönüleceğini belirlediğimiz kısımdır. Yukarıda tanımlamış olduğumuz ornekInput ve ornekOutput için örnek kullanım aşağıdadır.
<message name = "ornekRequest">
<part name = "ornekInput" type = "xsd:ornekInput"/>
</message>
<message name = "ornekResponse">
<part name = "ornekOutput" type = "xsd:ornekOutput"/>
</message>
Hangi response verisinin hangi request değerine göre gönderileceğini belirlediğimiz kısımdır. Aşağıda, yukarıda tanımladığımız request ve response tanımlamalarını ornek adında bir işleve atıyoruz. ornek işlevimiz aynı zamanda sunucuda yazdığımız fonksiyonun ismidir.
<portType name = "Ornek_PortType">
<operation name = "ornek">
<input message = "tns:ornekRequest"/>
<output message = "tns:ornekResponse"/>
</operation>
</portType>
portType işleminin nasıl iletileceğine dair ayrıntıları saklayan etikettir. Verilerin nasıl taşınacağını belirtir.
<binding name = "Ornek_Binding" type = "tns:Ornek_PortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
<operation name = "ornek">
<soap:operation soapAction = "ornek"/>
<input>
<soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
</input>
<output>
<soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
</output>
</operation>
</binding>
Bu etiket içerisinde sunucu tarafında kodların koşturulacağı adres tanımlanır.
<service name = "Ornek_Service">
<documentation>WSDL File for OrnekService</documentation>
<port binding = "tns:Ornek_Binding" name = "Ornek_Port">
<soap:address
location = "http://okesmez.com/php-soap-v2/server.php">
</port>
</service>
Yukarıda oluşturduğumuz wsdl dosyası web servisimizin hangi giriş parametreleri ile hangi işlevi gerçekleştirdiğini ve sonucunda hangi veriyi döndüğünü
içermektedir. Bizim örneğimizde sunucu tarafında ornek
adında bir fonksiyon çalıştırılmaktadır. Bu fonksiyon tanımlamsını portType etiketi altında yaptık.
ornek fonksiyonu ornekInput
adında object türünde bir girdi alıp, ornekOutput
adında object türünde bir çıktı üretmektedir. Bu girdi ve
çıktı tanımlamalarınıda message etiketi altında yaptık.
Şimdi php tarafında bir class oluşturup bu class içerisinde ornek
fonksiyonunu tanımlayarak istediğimiz işlemleri gerçeklemeliyiz. Class/Response.php
(Class/Response.php içeriği için tıkla)
oluşturup içerisinde ornek fonksiyonunu tanımladık. Sonrasında Tanımlamış olduğumuz bu Response class'ını soap server'a atamak için server.php adında bir
dosya oluşturup gerekli gerekli standart tanımlamaları yaptık
(server.php içeriği için tıkla).