Showing posts with label Web Servis. Show all posts
Showing posts with label Web Servis. Show all posts

Sunday, January 17, 2016

SOAP (Simple Object Access Protocol)

SOAP, web servisler tarafından kullanılan standart mesajlaşma protokolüdür. Dağıtık uygulamaların birbiriyle kolay iletişime geçebilmesi için tasarlanmıştır. SOAP bir standart olup yazılım dillerine bağımlı değildir. SOAP iletişimde fazladan yeni bir teknolojiye ihtiyaç duymaz, bunun yerine var olan internet teknolojileri üzerinde çalışır. SOAP mevcut internet altyapısında olan router, firewall ve proxy sunucularda herhangi bir değişiklik yapmadan kolayca çalışmaktadır. SOAP genellikle web kaynaklarına ulaşmak için web tarayıcılar tarafından kullanılan HTTP üzerinden iletilir. Bir SOAP mesajının genel yapısı aşağıda verildiği gibidir.

<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. 
<schema> 
<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).

WSDL (Web Services Description Language)

WSDL dokümanları, web servislerin nasıl tanımladığı bilgisini içeren XML dokümanlarıdır. 2007 yılından itibaren W3C tarafından tavsiye edilmektedir. Bir WSDL dokümanı aşağıdaki tablodaki etiketleri kullanarak web servisleri tanımlarlar.



Bir WSDL dokümanı genel olarak aşağıda verilen kod bloğu tarafından tanımlanır.
<definitions>
<types>   Veri tipleri  </types>
<message>   Mesajlar </message>
<portType>   Operasyonlar </portType>
<binding>   Protokol veri veri formatı tanımlamaları </binding>
</definitions>

Port types (Port tipleri) 

Port tipleri operasyonların ve ilgili mesajların tanımlandığı kısımdır. Aşağıda tanımlanabilecek operasyon tipleri verilmiştir.



Çift yönlü operasyona örnek olarak aşağıdaki kod bloğu gösterilebilir.

<wsdl:message name="HizmetCetvelInsertRequest">
<wsdl:part element="impl:HizmetCetvelInsert" name="parameters">
</wsdl:part> </wsdl:message>
<wsdl:portType name="Hitap4cWEBBean" >
<wsdl:operation name="HizmetCetvelInsert">
<wsdl:input message="impl:HizmetCetvelInsertRequest" name="HizmetCetvelInsertRequest"> </wsdl:input>
<wsdl:output message="impl:HizmetCetvelInsertResponse" name="HizmetCetvelInsertResponse"> </wsdl:output>
</wsdl:operation>
</portType >

Kod bloğunda “HizmetCetvelInsertRequest” mesajı şema içerisinde tanımlanmış “HizmetCetvelInsert” elementinden oluşan bir mesajdır. “HizmetCetvelInsert” operasyonu “HizmetCetvelInsertRequest” ve “HizmetCetvelInsertResponse” mesajları ile işlem yapan bir fonksiyonu tanımlamaktadır.   Servislerde en çok kullanılan yapı istek-cevap yapısıdır. Yukarıda verilen örnek bu durumuma uygundur.

Binding (Bağlayıcı)  

Protokol ve mesaj formatlarının detaylı olarak tanımlandığı kısımdır. Web servisin SOAP (Simple Object Access Protocol) ile ilişkisi burada tanımlanmaktadır. Örnek olarak aşağıdaki kod bloğu verilmiştir.

<wsdl:binding name="Hitap4cWEBBeanSoapBinding" type="impl:Hitap4cWEBBean"> <wsaw:UsingAddressing wsdl:required="false"/>
 <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="HizmetCetvelInsert">
 <wsdlsoap:operation soapAction="HizmetCetvelInsert"/>
<wsdl:input name="HizmetCetvelInsertRequest">
 <wsdlsoap:body use="literal"/>
</wsdl:input>
 <wsdl:output name="HizmetCetvelInsertResponse">
 <wsdlsoap:body use="literal"/>
 </wsdl:output>
</wsdl:operation>
 </wsdl:binding>

“Binding” elementi “name” ve “type” olmak üzere iki özelliğe sahiptir. “name” özelliği bağlamanın adını tanımlarken “type” özelliği portu belirtir. “soap:binding” elementi “style” ve “transport” olmak üzere iki özelliğe sahiptir. “style” özelliği “rpc” ve “document” değerlerini alabilmektedir. “transport” özelliği SOAP protokolünü tanımlamaktadır. Örnekte HTTP kullanılmıştır. SOAP mesajının nasıl kodlanacağını belirtmek için “literal” kullanılmıştır.

WSDL ve UDDI (Universal Description Discovery and Integration) 

OASIS (Yapılandırılmış Bilgi Standartları Örgütü) tarafından desteklenen bir girişim olan UDDI, kurumların sağladıkları servisleri yayınlamasını, bu bilgilerin daha sonra diğer kurumlarca taranıp bulunmasını, servislerin ve yazılım uygulamalarının internet üzerinde nasıl iletişimde olduğunu tanımlamasını sağlayan bir standarttır. UDDI üzerindeki servis kayıtları, güncellemeleri ve tarama işlemleri SOAP mesajları kullanılarak gerçekleştirilir.


Servis Yönelimli Mimari - SOA (Service Oriented Architecture)

SOA (Service Oriented Architecture), birçok uygulamanın kendi modülleri veya fonksiyonlarını başka uygulamalar tarafından kullanılacak şekilde tasarlandığı bir mimaridir. SOA, birbirinden bağımsız servisler aracılığı ile iş mantığının kurgulanmasını sağlar. İş modellerinin hızlı bir şekilde değişmesinden dolayı servis yönelimli mimari daha etkin olarak uygulanabilmektedir. SOA’da servislerin keşfedilebilir olması, kendi tanımlanabilmesi, birlikte çalışabilirliği, düşük bağımlılığı ve birleştirilebilir özelliklerde olması,  teknolojinin daha kolay kullanılabilmesine olanak tanır ve radikal değişimler işin bir potansiyel oluşturur. Servis tabanlı bir sistemin mantıksal gösterimi Şekil 1’de verilmiştir. Şekilde birbirinden bağımsız A ve B uygulamaları bir entegrasyon katmanı aracılığıyla etkileşmektedir.

Şekil 1.  Servis tabanlı mimariye sahip bir sistemin mantıksal gösterimi [1]

[1] Erl T., “Service-Oriented Architecture”, Prentice Hall, (2004).