Membedah WSDL sebagai kontrak layanan SOAP: struktur types message portType binding dan service, cara membaca WSDL 1.1, serta perbandingan dua pendekatan pengembangan contract-first melawan code-first beserta kelebihan dan kekurangannya.

Setelah di episode 2 kita memahami anatomi envelope, sekarang kita mempelajari pasangan wajibnya: WSDL (Web Services Description Language). Jika envelope adalah amplopnya, WSDL adalah kontraknya — dokumen yang mendefinisikan apa yang bisa dipanggil, dengan tipe data apa, dan di endpoint mana.
Mengapa WSDL begitu penting? Karena inilah yang membuat SOAP berbeda dari REST. Di REST, kontrak sering berupa dokumentasi informal. Di SOAP, kontrak bersifat machine-readable: tool generator membaca WSDL lalu membangkitkan client atau server secara otomatis. Perbedaan interpretasi kontrak adalah sumber utama masalah integrasi B2B — dan WSDL adalah alat untuk menghilangkannya.
WSDL 1.1 — versi yang mendominasi industri via WS-I Basic Profile — punya lima elemen utama dalam satu dokumen:
| Elemen | Fungsi | Analogi |
|---|---|---|
types | Definisi tipe data via XSD | Kamus tipe |
message | Definisi bagian pesan (input/output) | Sampul amplop |
portType | Operasi yang tersedia (abstrak) | Daftar fungsi |
binding | Cara operasi dikirim (SOAP/HTTP, gaya) | Aturan pengiriman |
service | Endpoint aktual (port + URL) | Alamat tujuan |
Contoh WSDL minimal untuk service getBalance:
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="urn:example:bank"
targetNamespace="urn:example:bank"
name="BankService">
<types>
<xsd:schema targetNamespace="urn:example:bank">
<xsd:element name="getBalance">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="accountNo" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="getBalanceResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="balance" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<message name="GetBalanceRequest">
<part name="parameters" element="tns:getBalance"/>
</message>
<message name="GetBalanceResponse">
<part name="parameters" element="tns:getBalanceResponse"/>
</message>
<portType name="BankPortType">
<operation name="getBalance">
<input message="tns:GetBalanceRequest"/>
<output message="tns:GetBalanceResponse"/>
</operation>
</portType>
<binding name="BankBinding" type="tns:BankPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getBalance">
<soap:operation soapAction=""/>
<input><soap:body use="literal"/></input>
<output><soap:body use="literal"/></output>
</operation>
</binding>
<service name="BankService">
<port name="BankPort" binding="tns:BankBinding">
<soap:address location="http://localhost:8080/bank"/>
</port>
</service>
</definitions>Alur membacanya: service menunjuk ke binding → binding menunjuk ke portType → portType memakai message → message memakai elemen di types. Satu dokumen, satu alur naratif lengkap.
use: document-literal vs rpc-encodedPada soap:binding, ada dua atribut yang menentukan bentuk pesan:
| Kombinasi | Arti | Catatan |
|---|---|---|
document + literal | Body berisi elemen XML sesuai XSD | Standar WS-I, paling banyak dipakai |
rpc + encoded | Body berisi wrapper method dengan encoding SOAP | Legacy, hindari untuk integrasi baru |
rpc + literal | Wrapper method, tetapi tanpa encoding | Jarang |
Praktik modern dan WS-I Basic Profile menuntut document-literal: body persis mengikuti skema XSD, tanpa layer encoding tambahan. Sebagian besar tool (JAX-WS, .NET, PHP) menghasilkan WSDL document-literal secara default.
Kalian menulis WSDL (dan XSD-nya) dulu, lalu generate kode server dan client dari WSDL.
wsdl2java dari CXF atau dotnet-svcutil).Kalian menulis kode Java/PHP/C# dulu, lalu tool membangkitan WSDL dari anotasi/atribut di kode.
@WebService, WCF atribut).Tip
Untuk integrasi antarperusahaan atau sistem yang bertahan lama, selalu mulai dari contract-first. Kontrak yang ditulis tangan lebih stabil dan mudah di-versioning daripada WSDL hasil generate yang berubah mengikuti refactoring kode. Detail versioning dibahas di episode 10.
Beberapa kesalahan yang paling sering merusak integrasi:
targetNamespace salah — elemen yang diharapkan di namespace bisnis ternyata berada di namespace default.use="encoded" di integrasi lintas stack — banyak tool modern menolak atau menghasilkan hasil tak terduga.soapAction — sebagian server menolak request yang soapAction-nya tidak cocok dengan binding.Warning
Jika WSDL kalian akan dipakai lintas vendor (Java ke .NET, .NET ke PHP), targetkan document-literal dan validasi dengan WS-I Basic Profile (episode 18). Ini mencegah mayoritas masalah interoperabilitas.
Inti yang harus dibawa pulang:
types, message, portType, binding, service — mengalir dari abstrak ke konkret.rpc-encoded hanya untuk legacy.Di episode 4 selanjutnya kita akan praktik nyata pertama: membuat service SOAP di Java dengan JAX-WS — dari anotasi @WebService dan @WebMethod, publishing endpoint, hingga generate client dengan wsimport. Sampai jumpa di episode 4!