Membedah arsitektur SOAP: envelope sebagai pembungkus pesan, header untuk metadata seperti WS-Security, body untuk payload request-response, dan fault untuk error, plus model transport HTTP HTTPS dan SMTP serta peran WSDL sebagai kontrak layanan.

Setelah di episode 1 kita memahami sejarah dan alasan SOAP bertahan, pada episode ini kita masuk ke inti teknisnya: struktur dan arsitektur pesan SOAP. Inilah fondasi yang akan kalian pakai terus — dari episode 3 (WSDL) sampai episode 22 (refleksi akhir).
Mengapa struktur ini penting? Karena SOAP adalah protokol dengan aturan ketat: server menolak pesan yang struktur atau namespace-nya salah. Tidak seperti JSON yang bebas bentuk, envelope SOAP punya anatomi yang sudah dibakukan. Kalian harus hafal anatomi ini di luar kepala sebelum menyentuh tool apa pun.
Setiap pesan SOAP adalah dokumen XML dengan satu elemen root bernama Envelope yang berisi tiga bagian opsional-wajib berikut:
| Bagian | Elemen | Wajib? | Fungsi |
|---|---|---|---|
| Pembungkus | Envelope | Ya | Root pesan; menyimpan namespace SOAP |
| Metadata | Header | Opsional | Autentikasi, WS-Security, transaction, routing |
| Isi | Body | Ya | Payload request/response (atau Fault) |
Contoh lengkap envelope SOAP 1.2:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header>
<m:transaction xmlns:m="urn:example:meta" soap:mustUnderstand="1">
7f3a9c
</m:transaction>
</soap:Header>
<soap:Body>
<tns:getBalance xmlns:tns="urn:example:bank">
<tns:accountNo>ACC-001</tns:accountNo>
</tns:getBalance>
</soap:Body>
</soap:Envelope>Perhatikan tiga hal di contoh ini:
http://www.w3.org/2003/05/soap-envelope; SOAP 1.1 memakai http://schemas.xmlsoap.org/soap/envelope/. Keduanya berbeda dan tidak bisa dicampur.mustUnderstand — receiver yang tidak paham elemen bertanda mustUnderstand="1" wajib menolak pesan. Ini mekanisme SOAP untuk evolusi fitur secara aman.urn:example:bank), bukan namespace SOAP.Header adalah bagian paling fleksibel dari SOAP. Di sinilah berbagai spesifikasi WS-* menyimpan datanya:
Header bersifat opsional tetapi powerful: ia memisahkan transport plumbing dari payload bisnis, sehingga middleware (gateway, ESB) bisa membaca dan menambah header tanpa menyentuh isi body.
Body berisi data bisnis yang dikirim antara client dan server. Bentuknya ditentukan oleh WSDL: untuk operasi request-response, satu elemen body berisi elemen request, dan response datang dengan elemen jawaban. Contoh response untuk request di atas:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<tns:getBalanceResponse xmlns:tns="urn:example:bank">
<tns:balance currency="IDR">2750000</tns:balance>
</tns:getBalanceResponse>
</soap:Body>
</soap:Envelope>Perhatikan pola penamaan getBalance → getBalanceResponse: ini konvensi WSDL yang otomatis dipakai oleh tool generator seperti JAX-WS.
Ketika operasi gagal, SOAP tidak mengembalikan halaman HTML error — ia mengembalikan elemen Fault di dalam body dengan kode dan detail standar:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Receiver</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="id">Akun tidak ditemukan</soap:Text>
</soap:Reason>
<soap:Detail>
<e:error xmlns:e="urn:example:bank">ACC-001 tidak dikenal</e:error>
</soap:Detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>Detail lengkap faultcode, perbedaan SOAP 1.1 vs 1.2, dan strategi error mapping akan dibahas di episode 8.
SOAP adalah protokol yang transport-agnostic: pesan bisa melintasi HTTP, HTTPS, SMTP, bahkan message queue. Praktik dominan adalah SOAP over HTTP, di mana service di-post ke satu endpoint dan balasan datang sebagai HTTP response:
Karena setiap pesan membawa seluruh konteks (header + body) di satu dokumen, SOAP disebut stateless di level transport: server tidak perlu menyimpan sesi antara dua request — cukup satu round-trip untuk satu operasi lengkap.
Di atas arsitektur pesan berdiri WSDL — deskripsi machine-readable yang "menjual" service ke dunia: operasi apa yang tersedia, tipe data apa yang dipakai, di endpoint mana, dan bagaimana pesannya dibentuk. Analoginya: jika envelope adalah amplopnya, WSDL adalah buku petunjuk pengiriman lengkapnya. Tanpa WSDL, client tidak bisa membangun request yang valid. Kita bedah WSDL secara penuh di episode 3.
Tip
Trik untuk membedakan SOAP 1.1 dan 1.2 tanpa membuka dokumentasi: lihat namespace Envelope-nya. schemas.xmlsoap.org berarti 1.1; www.w3.org/2003/05 berarti 1.2. Kesalahan namespace adalah penyebab error SOAP paling umum di lapangan.
Inti yang harus dibawa pulang:
mustUnderstand="1" memaksa receiver menolak header yang tidak ia pahami — mekanisme evolusi fitur.Di episode 3 selanjutnya kita akan membedah WSDL sebagai kontrak layanan — struktur types, message, portType, binding, dan service, plus perbandingan pendekatan contract-first vs code-first. Sampai jumpa di episode 3!