Pages

Monday, March 18, 2013

SOAP, XML-RPC dan WSDL


Ø SOAP
SOAP (Simple Object Access Protocol) adalah standar untuk bertukar pesan-pesan berbasis XML melalui jaringan komputer atau sebuah jalan untuk program yang berjalan pada suatu sistem operasi (OS) untuk berkomunikasi dengan program pada OS yang sama maupun berbeda dengan menggunakan HTTP dan XML sebagai mekanisme untuk pertukaran data.
SOAP menspesifikan secara jelas bagaimana cara untuk meng-encodeheader HHTP dan file XML sehingga program pada suatu komputer dapat memanggil program pada komputer lain dan mengirimkan informasi, dan bagaimana program yang dipanggil memberikan tanggapan.
SOAP menggunakan teknologi XML utuk mendefinisikan rangka kerja pemesanan terekstrensi di mana menyediakan konstruksi pesan yang dapat dipertukarkan pada protokol berbeda. Rangka kerja dirancang bebas dari model pemrograman dan spesifikasi implementasi semantik.
SOAP meliputi empat bagian:
·         SOAP paket (amplop), mendefinisikan sebuah paket menggambarkan apa isi pesan yang terkirim, yang seharusnya menerima dan menangani dan bagaimana menangani kerangka kerja mereka;
·         SOAP Encoding aturan (aturan encoding), digunakan untuk merepresentasikan aplikasi perlu menggunakan tipe data contoh;
·        SOAP RPC kata (RPC representasi), bahwa panggilan prosedur terpencil dan tanggapan dari perjanjian;
·         SOAP Binding (mengikat), protokol yang mendasari digunakan untuk bertukar informasi.
Meskipun empat bagian sebagai bagian dari SOAP, sebagai definisi keseluruhan, tetapi mereka secara fungsional berpotongan satu sama independen lain. Secara khusus, amplop dan aturan encoding didefinisikan di ruang nama XML yang berbeda (namespace), sehingga membuat definisi mudah.
Dua tujuan desain utama SOAP adalah kesederhanaan dan skalabilitas. Ini berarti bahwa ada beberapa sistem informasi tradisional atau sistem objek terdistribusi, beberapa properti tidak akan menjadi bagian dari spesifikasi SOAP.
Contoh dari permintaan soap
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header>
</soap:Header>
<soap:Body>
<m:GetStockPrice xmlns:m="http://www.example.org/stock">
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>

Ø  XML-RPC
Menurut http://www.xmlrpc.com, XML-RPC adalah suatu spesifikasi dan set implementasi yang mengijinkan software dengan sistem operasi terpisah, berjalan di lingkungan yang berbeda untuk membuat procedure call di internet.
XML-RPC menggunakan HTTP sebagai transport dan XML sebagai encoding. XML-RPC dirancang sesederhana mungkin namun dapat mentransmisikan, memproses dan mengirim balik struktur data yang kompleks.
XML-RPC adalah spesifikasi final yang lebih sederhana dan mudah diimplementasikan dibanding SOAP. Secara fundamental perubahan yang dibawa oleh kedua adalah kemampuan untuk memindahkan data kemana pun melalui web. Sebelumnya hal itu hanya mampu ditangani oleh Electronic Data Interchange (EDI). EDI mendefiniskan message dan protocol yang digunakan untuk pertukaran data melalu jaringan. Tapi hal ini mengunci jaringan-jaringan yang tergabung pada satu standar tertentu, dan membuat mahal implementasi pada jaringan baru yang akan digabungkan.
XML-RPC dan SOAP dikerjakan dengan mengubah sekumpulan parameter (skalar, string, tanggal, array, record, data biner) ke transmisi XML. XML-RPC didefinisikan beroperasi diatas koneksi HTTP, sementara SOAP mendeskripsikan format amplop-nya untuk RPC request yang bisa dikirimkan melalu HTTP, SMTP, FTP atau beberapa protokol TCP/IP lainnya. XML-RPC melewatkan parameternya dengan posisi sementara SOAP melewatkan paramaternya dengan nama.
XML-RPC awalnya dikerjakan oleh Dave Winner dari Userland (kemudian menjadi salah satu kontributor SOAP, sebagai teknologi lanjutan yang diperluas dari XML-RPC). Masalah klasik yang mesti dipecahkannya mula-mula adalah bagaimana membuat perangkat lunak yang bisa berjalan di lingkungan yang berbeda saling berbicara. Komunikasi lintas-platform ini didemonstrasikan Winner dengan meletakkan perintah-perintah remote procedure pada body HTTP POST.Selanjutnya hanya diperlukan kosakata XML yang mendefinisikan nama-nama potongan kode perintah jarak jauh dan paramater-parameter yang diperlukannya.

Elemen XML pada XML-RPC dengan sederhana mendefinsikan kosakata untuk menyampaikan informasi prosedur-prosedur mana yang akan dieksekusi pada remote-server. Ketika server menerima message XML-RPC dari HTTP POST request, dokumen XML-nya akan digunakan untuk memicu sebuah remote-procedure dan hasilnya dikirimkan balik pada pengirimnya sebagai XML juga.
Dengan semangat pakai-ulang (reusability), XML-RPC menggunakan tipe data XMLSchema untuk paramater dan prosedur yang akan dipanggilnya. Berikut ini adalah daftar tipe dataskalar untuk parameter XML-RPC dan nilai-nilainya.


Tag
Tipe
Contoh
<boolean>
0 bernilai benar
1 bernilai salah
<boolean>1</boolean>
<string>
ASCII string
<string>Moonlight</string>
<double>
Bentuk decimal
<double>-66.6</double>
<i4> atau <int>
integer
<int>888</int> atau <i4>444</i4>
<base64>
Binary kode
<base64> 7HYBsu76HT7HJ </base64>
<dateTime.iso8601>
Date/time
<dateTime.iso8601>20032224T14:05:43</dateTime.iso8601>
<array>
array
<array>
  <data>
    <value><i4>1404</i4></value>
    <value><string>Something here</string></value>
    <value><i4>1</i4></value>
  </data>
</array>
<struct>
Associative array
<struct>
  <member>
    <name>foo</name>
    <value><i4>1</i4></value>
  </member>
  <member>
    <name>bar</name>
    <value><i4>2</i4></value>
  </member>
</struct>
<nil>
Data null
<nil/>

Ø  WSDL
WSDL / Web Service Description Language, menggambarkan layanan sebagai endpoint dari sebuah jaringan atau port. Spesifikasi WSDL menyediakan format XML untuk sebuah dokumen dengan tujuan tertentu. WSDL sering digunakan dalam kombinasi dengan schema SOAP dan XML untuk memberikan web service melalu internet. Sebuah program client yang terhubung ke layanan web dapat membaca file WSDL untuk menentukan operasi apa yang tersedia pada server. Setiap tipe data khusus yang digunakan tertanam dalam file WSDL dalam bentuk schema XML. Client dapat menggunakan SOAP untuk benar-benar memanggil salah satu operasi yang terdaftar dalam file WSDL menggunakan XML atau HTTP.
WSDL menyediakan sebuah kamus XML untuk menjabarkan detail-detail ini. WSDL digunakan di mana skema XML tidak digunakan lagi dengan menyediakan jalur pesan-pesan grup menjadi operasi-operasi dan operasi-operasi menjadi antarmuka. Ini juga menyediakan jalur untuk medefinisikan binding-binding untuk setiap antamuka dan kombinasi protokol sepanjang alamat titik akhir utnuk setiap kalinya. Definisi WSDL yang lengkap terdiri dari seluruh informasi yang dibutuhkan untuk meminta web service. Pengembang yang mau mempermudah yang lain untuk mengakses service-servicenya harus menyediakan defisi-definisi WSDL.
WSDL memainkan peranan penting pada seluruh arsitektur web service semenjak menjabarkan kontrak lengkap pada komunikasi aplikasi (sama seperti peran IDL pada arsitektur DCOM). Walaupun teknik-teknik lain untuk menjabarkan Web service ada, WS-I Basic Profile Versi 1.0 memadati penggunaan WSDL dan skema XML untuk menjabarkan web service. Ini membantu untuk memastikan interoperbilitas pada layer deskripsi servis.

Contoh code :
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://www.w3.org/ns/wsdl" 
             xmlns:tns="http://www.tmsws.com/wsdl20sample" 
             xmlns:whttp="http://schemas.xmlsoap.org/wsdl/http/"
             xmlns:wsoap="http://schemas.xmlsoap.org/wsdl/soap/"
             targetNamespace="http://www.tmsws.com/wsdl20sample">
 
 
<!-- Abstract type -->
   <types>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns="http://www.tmsws.com/wsdl20sample"
                targetNamespace="http://www.example.com/wsdl20sample">
 
         <xs:element name="request">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="header" maxOccurs="unbounded">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:string">
                              <xs:attribute name="name" type="xs:string" use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
                  <xs:element name="body" type="xs:anyType" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute name="method" type="xs:string" use="required"/>
               <xs:attribute name="uri" type="xs:anyURI" use="required"/>
            </xs:complexType>
         </xs:element>
 
         <xs:element name="response">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="header" maxOccurs="unbounded">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:string">
                              <xs:attribute name="name"  use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
                  <xs:element name="body" type="xs:anyType" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute name="status-code" type="xs:anySimpleType" use="required"/>
               <xs:attribute name="response-phrase" use="required"/>
            </xs:complexType>
         </xs:element>
      </xs:schema>
   </types>
 
 
<!-- Abstract interfaces -->
   <interface name="RESTfulInterface">
      <fault name="ClientError" element="tns:response"/>
      <fault name="ServerError" element="tns:response"/>
      <fault name="Redirection" element="tns:response"/>
      <operation name="Get" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
      <operation name="Post" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
      <operation name="Put" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
      <operation name="Delete" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
   </interface>
 
 
 
<!-- Concrete Binding Over HTTP -->
   <binding name="RESTfulInterfaceHttpBinding" interface="tns:RESTfulInterface" 
            type="http://www.w3.org/ns/wsdl/http">
      <operation ref="tns:Get" whttp:method="GET"/>
      <operation ref="tns:Post" whttp:method="POST" 
                 whttp:inputSerialization="application/x-www-form-urlencoded"/>
      <operation ref="tns:Put" whttp:method="PUT" 
                 whttp:inputSerialization="application/x-www-form-urlencoded"/>
      <operation ref="tns:Delete" whttp:method="DELETE"/>
   </binding>
 
<!-- Concrete Binding with SOAP-->
   <binding name="RESTfulInterfaceSoapBinding" interface="tns:RESTfulInterface" 
            type="http://www.w3.org/ns/wsdl/soap" 
            wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"
            wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request-response">
      <operation ref="tns:Get" />
      <operation ref="tns:Post" />
      <operation ref="tns:Put" />
      <operation ref="tns:Delete" />
   </binding>
 
 
<!-- Web Service offering endpoints for both bindings-->
   <service name="RESTfulService" interface="tns:RESTfulInterface">
      <endpoint name="RESTfulServiceHttpEndpoint" 
                binding="tns:RESTfulInterfaceHttpBinding" 
                address="http://www.example.com/rest/"/>
      <endpoint name="RESTfulServiceSoapEndpoint" 
                binding="tns:RESTfulInterfaceSoapBinding" 
                address="http://www.example.com/soap/"/>
   </service>
</description>