<SOAP-ENV:Envelope xmlns:SOAPENV=" http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP, Header (başlık) ve Body (gövde) olarak adlandırılan iki ana bölümden oluşur. Bu iki kısım Envelope (zarf) adı verilen eleman içerisinde bulunmaktadır.
İstemci SOAP uygulaması bir SOAP istek mesajı oluşturarak bu isteği SOAP sunucusunda tanımlanmış servis uç noktalarından (end point) birisi tarafından çalıştırılması için gönderir. SOAP sunucu ilgili servisi çalıştırdıktan sonra SOAP yanıt mesajı hazırlar. Hazırlanan SOAP yanıt mesajı istemciye iletilir. SOAP mesajı HTTP paketi olarak iletilir. SOAP gövdesi çağırılacak metot ve metodun içerdiği parametreleri içerir. SOAP gövdesi içinde kodlanarak gönderilen bu mesaj, web servisi tarafından çözülür ve gerekli parametreler ve metot çağırım bilgilerine göre işlemlerini gerçekleştirdikten sonra, istemciye döndüreceği cevap bilgileri için, yine SOAP protokolüne uygun XML mesajlarını oluşturur. Bu mesajlar HTTP üzerinden istemci uygulamaya ulaşır, burada çözülür ve değerlendirilir. HTTP protokolünü desteklediğinden ve standart bir mesaj yapısı içerdiğinden, SOAP sayesinde web servisine platformdan bağımsız olarak çalışabilmektedir. Örneğin .NET platformunda hazırlanmış bir web servise JAVA ile erişilebilmektedir. Ayrıca HTTP standardı kullanıldığı iletişim işletim sistemlerine de bağımlı değildir. SOAP mesajlarının nasıl işlediği Şekil 1’de gösterilmiştir.
Şekil 1. SOAP mesajlarının gösterimi [1] |
SOAP mesajı oluşturulurken RPC (Remote Procedure Call) veya “document” formatında oluşturulabilmektedir. Buradaki “encoded” ve “literal” deyimleri WSDL’den SOAP’a haritalamanın nasıl yapılacağını belirtmektedir. SOAP mesajlarının formatları aşağıda açıklanmıştır:
- RPC/encoded: Örnek WSDL kodu aşağıda verilmiştir.
<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
<part name="y" type="xsd:float"/>
</message> <message name="empty"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
Bu WSDL kullanılarak elde edilen SOAP mesajı aşağıdaki gibidir.
<soap:envelope>
<soap:body>
<myMethod>
<x xsi:type="xsd:int">5
</x>
<y xsi:type="xsd:float">5.0
</y>
</myMethod>
</soap:body>
</soap:envelope>
Bu mesaj formatının WSDL kodu olabildiğince basit olmaktadır. Operasyon adı mesajda yer aldığı için bu mesajın karışıklığı yer vermeden kolayca çözülmesi mümkündür. Kodlama bilgisi olan “xsd:int” gibi yapılar performansı düşürmektedir. Mesaj içindeki x ve y’yi tanımlayan yapılar şema içinde tanımlanmış özellikleri kullanırken soap:body WSDL içinde yer alan bazı tanımlamalar içermektedir. Bu yüzden mesajın geçerlemesi zorlaşmaktadır.
- RPC/literal: Örnek WSDL kodu aşağıda verilmiştir.
<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
<part name="y" type="xsd:float"/>
</message> <message name="empty"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
Bu WSDL kullanılarak elde edilen SOAP mesajı aşağıdaki gibidir.
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x>
<y>5.0</y>
</myMethod>
</soap:body>
</soap:envelope>
Bu mesaj formatında da WSDL olabildiğince basittir. Operasyon adının mesajda yer alması karmaşıklığı önlemektedir. Mesajdan tip açıklaması kaldırılmıştır.
- Document/literal: Diğer tiplere göre WSDL kodunda bazı değişiklikler içermektedir.
<types>
<schema>
<element name="xElement" type="xsd:int"/>
<element name="yElement" type="xsd:float"/>
</schema>
</types>
<message name="myMethodRequest">
<part name="x" element="xElement"/>
<part name="y" element="yElement"/>
</message> <message name="empty"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
Bu WSDL koduna ait SOAP mesajı aşağıda verilmiştir.
<soap:envelope>
<soap:body>
<xElement>5</xElement>
<yElement>5.0</yElement>
</soap:body>
</soap:envelope>
Bu mesajlaşma tipinin en önemli özelliği SOAP içindeki bütün tanımlamalar şemada belirtildiği için geçerleme yapılması kolaydır. En büyük dezavantajı ise operasyon adının mesajda yer almamasıdır.
- Document/literal wrapped: Bir önceki formatın eksikliklerini gidermek için WSDL kodunda daha fazla ayrıntı içerir.
<element name="myMethod">
<complexType> <sequence>
<element name="x" type="xsd:int"/>
<element name="y" type="xsd:float"/>
</sequence>
</complexType>
</element>
<element name="myMethodResponse">
<complexType/>
</element>
</schema>
</types>
<message name="myMethodRequest">
<part name="parameters" element="myMethod"/>
</message>
<message name="empty">
<part name="parameters" element="myMethodResponse"/>
</message>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
Bu WSDL koduna ait SOAP mesajı aşağıda verilmiştir.
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x>
<y>5.0</y>
</myMethod>
</soap:body>
</soap:envelope>
Bu mesaj formatı RPC/literal ile bire bir benzeyen SOAP mesajları üretse de soap:body için çocuk elementi RPC/literal’de operasyon adına denk gelirken burada ise mesaj içeriğinin element adına denk gelmektedir.
[1] Erl T., “Service-Oriented Architecture”, Prentice Hall, (2004).
No comments:
Post a Comment