Mengoptimalkan transmisi file biner melalui SOAP: cara kerja MTOM/XOP yang memindahkan base64 keluar dari XML menjadi attachment multipart, penggunaan DataHandler di Java, upload-download dokumen, serta perbandingan MTOM dengan pendekatan SwA yang lebih lama.

Setelah di episode 10 kita mengelola kebijakan dan versi, sekarang kita tangani kasus khusus yang sering muncul di integrasi B2B: mengirim file biner — scan dokumen, PDF, gambar, tanda tangan digital. Di episode 7 kita menyebut bahwa base64 di dalam XML boros; episode ini membahas solusi resminya: MTOM.
Mengapa penting? Coba kirim scan KTP 2 MB sebagai base64: ukurannya membengkak ~33% menjadi ~2,7 MB, dan seluruhnya harus diparsing sebagai teks di memory. Untuk sistem yang mengirim ribuan dokumen sehari, ini membebani bandwidth dan CPU. MTOM menyelesaikannya dengan memindahkan byte biner keluar dari XML — tanpa mengubah kontrak SOAP.
Base64 mengubah data biner menjadi teks yang aman untuk XML. Konsekuensinya:
Untuk dokumen kecil (logo, KTP), base64 di dalam XML masih bisa ditoleransi. Untuk file besar atau throughput tinggi, ini tidak scalable.
MTOM (Message Transmission Optimization Mechanism) memakai XOP (XML-binary Optimized Packaging): byte biner dikeluarkan dari dokumen XML dan dikirim sebagai attachment dalam pesan MIME multipart, sementara XML hanya menyimpan placeholder yang menunjuk ke attachment-nya.
HTTP/1.1 200 OK
Content-Type: multipart/related; boundary=soap-mtom;
type="application/xop+xml"
--soap-mtom
Content-Type: application/xop+xml; type="text/xml"
<?xml version="1.0"?>
<soap:Envelope ...>
<soap:Body>
<uploadDocument>
<fileName>ktp.pdf</fileName>
<content>
<xop:Include href="cid:ktp-2026"
xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</content>
</uploadDocument>
</soap:Body>
</soap:Envelope>
--soap-mtom
Content-Type: application/pdf
Content-ID: <ktp-2026>
Content-Transfer-Encoding: binary
%PDF-1.4 ... (byte mentah PDF) ...
--soap-mtom--Elemen <xop:Include href="cid:ktp-2026"/> adalah placeholder. Parser XOP menggantikannya dengan byte dari part yang Content-ID-nya cocok. Kontrak SOAP tidak berubah — di level semantik, content tetap elemen base64Binary; hanya representasi fisiknya yang dioptimasi.
Note
WSDL tetap mendeklarasikan content sebagai xsd:base64Binary. Client dan server yang mendukung MTOM menegosiasikan pengiriman lewat MIME multipart secara transparan; yang tidak mendukung MTOM tetap bisa menerima base64 di dalam XML. Inilah kenapa MTOM aman untuk interoperabilitas.
Java memakai DataHandler (dari JAXB/JavaBeans Activation Framework) sebagai tipe untuk data biner yang dioptimasi. Saat JAX-WS mendeteksi DataHandler, ia otomatis memakai MTOM bila fiturnya diaktifkan:
import jakarta.activation.DataHandler;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlMimeType;
public class DocumentPayload {
@XmlElement
private String fileName;
@XmlElement
@XmlMimeType("application/octet-stream")
private DataHandler content;
}Aktifkan MTOM di service:
import jakarta.xml.ws.soap.SOAPBinding;
SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
binding.setMTOMEnabled(true);Setelah itu, upload dokumen cukup dengan DataHandler:
@WebMethod
public void uploadDocument(DocumentPayload doc) {
DataHandler handler = doc.getContent();
InputStream in = handler.getInputStream();
// simpan ke penyimpanan file/objek storage
}getInputStream() membaca byte dari part MIME tanpa pernah memuat seluruhnya sebagai string — itulah keuntungan memory utama MTOM.
| Bahasa | Pendekatan | Catatan |
|---|---|---|
| Java | DataHandler + setMTOMEnabled(true) | Otomatis saat tipe DataHandler |
| .NET | MtomMessageEncodingBindingElement | Konfigurasi binding WCF |
| PHP | SoapClient menangani attachment internal | Kontrol lebih manual |
| Python (zeep) | Pemetaan base64Binary ke bytes | Dukungan MTOM terbatas — test dulu |
Warning
Dukungan MTOM lintas stack belum seragam. Jika mitra integrasi memakai stack yang dukungan MTOM-nya tidak lengkap, aktifkan MTOM dengan fallback: biarkan binding menegosiasikan, dan pastikan server tetap menerima pesan base64 biasa. Uji keduanya sebelum produksi.
Sebelum MTOM, ada SwA (SOAP with Attachments, 2000) — attachment MIME yang tidak diwakili placeholder XOP. Perbandingannya:
| Aspek | SwA | MTOM/XOP |
|---|---|---|
| Referensi dari XML | URL MIME href informal | xop:Include standar |
| Standar interoperabilitas | Lemah (tidak di WS-I Basic Profile) | Standar W3C, direkomendasikan |
| Representasi kontrak | Attachment "menempel", tak terwakili di WSDL | Elemen base64Binary tetap ada di WSDL |
| Dukungan modern | Menurun | Standar tooling modern (CXF, WCF) |
Untuk integrasi baru, selalu pilih MTOM. SwA hanya relevan untuk memahami service legacy yang masih hidup di beberapa sektor.
DataHandler — kalau tipe biner memakai byte[], JAX-WS tetap mengirim base64 di XML; MTOM hanya otomatis untuk DataHandler.Inti yang harus dibawa pulang:
<xop:Include>.base64Binary tetap, optimasi transparan.DataHandler + setMTOMEnabled(true).Di episode 12 selanjutnya kita akan membahas performance: caching, pooling & timeout — tuning client HTTP (connection pooling, timeout, retry, caching response) dan tuning server (thread pool, batas ukuran payload, monitoring service). Sampai jumpa di episode 12!