Bekerja dengan SOAP seringkali menjadi rumit, dan berurusan dengan WSDL mungkin merupakan kontribusi besar untuk kompleksitas tugas ini. Sungguh, itu bisa menjadi hal yang paling tidak diharapkan untuk dihadapi ketika Anda masuk ke bahasa modern & mewah seperti misalnya, Scala, yang terkenal dengan reaktivitasnya dan cara yang tidak sinkron dalam menangani permintaan. Bahkan, banyak pengembang perangkat lunak yang baru-baru ini masuk ke industri, mungkin bahkan tidak tahu tentang protokol SOAP dan WSDL, dan menjadi cepat jengkel atau bahkan marah ketika pertama kali mencoba terhubung ke layanan warisan tersebut. Jadi, haruskah kita mencabut ini semua demi tumpukan teknologi modern, atau mungkin ada solusi yang kurang menyakitkan?
SABUN: Warisan
Sulit untuk berargumen bahwa SOAP ini kedengarannya sudah ketinggalan zaman akhir-akhir ini, terutama kontras dengan keadaan teknologi saat ini. Menulis klien WSDL dari awal dengan Kotlin, Scala atau bahasa modern lainnya bisa jadi menyusahkan, dan kurangnya dokumentasi yang tepat untuk itu tidak membuat hidup lebih mudah. Tapi saya punya kabar baik untuk Anda, ada titik terang di kerajaan SABUN yang gelap. Ya, sebenarnya WSDL itu sendiri. Meskipun kelas berat dan agak jelek, ia memiliki keunggulan tertentu. Kelebihan format WSDL membuatnya cukup mudah menghasilkan kode klien (dan juga server), mungkin bukan untuk manusia tetapi pasti untuk sistem otomatis.
Bahkan dibandingkan dengan spesifikasi API modern, sebenarnya bisa tetap setara dengan OpenAPI atau konsep API Swagger mewah di mana semuanya dijelaskan dalam spesifikasi bahasa-agnostik. Ini memungkinkan peluang besar untuk interoperabilitas antara berbagai platform dan bahasa, hingga ke tingkat implementasi. Misalnya, jika seseorang mengekspos mis. Layanan web .NET dengan spesifikasi WSDL, yang lain dapat secara otomatis menghasilkan klien berbasis JVM untuk terhubung dengannya dengan sedikit atau tanpa rasa sakit konversi format data atau ketidakcocokan.
Sihir Impor WSDL
Mari kita putar lebih jauh dan berbicara tentang pembuatan kode otomatis. Anda mungkin terkejut, tetapi sebagian besar platform enterprise-ish, terutama Java dan .NET, dilengkapi dengan alat penghasil kode WSDL. Misalnya, ada wsimport yang datang sebagai bagian dari distribusi JDK. Alat-alat semacam itu cukup kuat dan harus mencakup tugas pembangkitan otomatis ujung ke ujung. Satu-satunya bagian yang tersisa adalah untuk menghubungkan logika bisnis Anda ke kode klien dan memanfaatkannya.
Jadi, karena kita berada pada tema Scala saat ini, mari kita lihat lebih dalam pada alat wsimport
Java:
wsimport -p stockquote http://stockquote.example.com/quote?wsdl
Perintah mengambil skema WSDL sebagai parameter yang diperlukan, dan pada dasarnya itu hanya cukup untuk menghasilkan seluruh set POJO dan antarmuka, yang ditandai dengan semua penjelasan yang tepat. Yang terakhir benar-benar melakukan trik: ini pada dasarnya yang memungkinkan semua hal terjadi. Ketika dieksekusi, JVM mengirimkan kode klien Anda bersama-sama dengan implementasi klien layanan web internal, yang keluar dari kotak, sehingga Anda tidak perlu repot banyak tentang jaringan tingkat rendah & IO. Sisa dari bisnis adalah untuk menangani seluk beluk dengan benar, dan berhati-hati dengan kesalahan dan pengecualian.
Bawa Otomasi ke Tingkat Selanjutnya dengan SBT
Baiklah, ini saatnya untuk latihan. Bayangkan kita memiliki beberapa layanan web SOAP yang perlu kita hubungkan juga, dan mereka mengekspos WSDL. Saya sengaja mengambil beberapa untuk pengujian, demi sains & pendidikan saja, tentu saja. Jalankan pembuat kode:
wsimport -s ../src/main/java -extension -p your.package.wsdl.nl \ -XadditionalHeaders -Xnocompile \ http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL
Ini menghasilkan sejumlah kode Java mentah di folder output. Kami dapat melanjutkan dengan menghubungkan logika bisnis kami, seperti yang disarankan di atas. Tapi tunggu sebentar, bagaimana jika sisi server berubah - kita akan menyadarinya hanya pada saat eksekusi kode aktual (atau pada saat kegagalan pengujian integrasi, jika kita memiliki beberapa). Tidak cantik. Dengan cepat tidak cantik sama sekali jika Anda akan berpikir untuk melakukan semua kode Java Java boilerplate ini ke repositori Scala murni Anda.
Tentu saja, ini akan menjadi cara yang lebih baik untuk menghasilkan semua hal secara otomatis dan menjaga semuanya tetap ramping & bersih. Langkah pertama untuk ini adalah mengotomatisasi mendapatkan semua kelas WSDL dengan satu perintah dan membuat skrip Shell dari ini. Saya benar-benar membuat satu untuk Anda sehingga Anda dapat melihatnya: wsdl_import.sh .
Lalu kita bisa membungkusnya dengan tugas build: mari kita ambil SBT sebagai contoh, karena kita berada di Scala, jadi sesuatu seperti ini seharusnya bekerja:
lazy val wsdlImport = TaskKey[Unit]("wsdlImport", "Generates Java classes from WSDL") wsdlImport := { val wsdlSources = "./wsdl/src/main/java" val d = file(wsdlSources) if (d.isDirectory) { // don't forget to rename to your fav one in line with WSDL generating sh val gen = file(s"$wsdlSources/github/sainnr/wsdl") if (!gen.exists() || gen.listFiles().isEmpty) { import sys.process._ println("[wsdl_import] Importing Java beans from WSDL...") "./wsdl/bin/wsdl_import.sh" ! } else println("[wsdl_import] Looks like WSDL is already imported, skipping.") } else println(s"[wsdl_import] Make sure the directory ${d.absolutePath} exists.") }
Sumber
Sekarang, kita perlu memastikan bahwa kita memiliki semua kode ini sebelum kompilasi bagian Scala, untuk alasan yang jelas. Mudah sekali, kita memiliki SBT sehingga kita hanya perlu menjalankan skrip Shell sebagai tugas SBT seperti di atas dan menjalankan berbagai hal dengan urutan yang benar, benar? Yah, ini sedikit lebih rumit dalam kehidupan nyata. Tanpa masuk ke banyak detail tentang bagaimana SBT bekerja, segalanya menjadi lebih mudah jika kita memisahkan bagian WSDL-Java ini menjadi sub-proyek mandiri, dan membuat ketergantungan yang tepat dalam konfigurasi master SBT.
lazy val wsdl = (project in file("wsdl")) .settings ( publishSettings, sources in (Compile, doc) := Seq.empty ) lazy val root = (project in file(".")) .aggregate(wsdl) .dependsOn(wsdl)
Sumber
Ketika Anda mengkompilasi proyek master, SBT terlebih dahulu memastikan sub proyek sudah dikompilasi. Tetapi ada masalah: ketika Anda baru saja memeriksa repositori Anda, Anda mungkin tidak menjalankan kompilasi. Jadi ketika Anda pertama kali membukanya di editor, tentu saja beberapa dependensi akan hilang. Mudah-mudahan, satu-satunya hal yang Anda butuhkan adalah menjalankan sbt compilecommand dan, mungkin, menyegarkan proyek di IDE.
Mungkin ada peringatan lain jika Anda menjalankan aplikasi Scala Anda sebagai klien yang berdiri sendiri atau dalam wadah web lean (misalnya Netty jika Anda menggunakan Play Framework). Dalam hal ini, sangat mungkin runtime aplikasi akan kehilangan bit implementasi yang membantu JVM untuk melakukan sihir SOAP untuk Anda, berkat versi JRE modern dan proyek Java Jigsaw. Tidak perlu panik, cukup tambahkan beberapa perpustakaan ke daftar dependensi Anda, atau lempar rt.jar tunggal dari distribusi JRE Anda sebagai dependensi yang tidak dikelola:
unmanagedJars in Test += Attributed.blank( file(System.getenv("JAVA_HOME") + "/jre/lib") )
Sebagai kesimpulan
Baiklah, sebagai rekap: kami telah belajar sedikit tentang SOAP dan WSDL dan mudah-mudahan menyadari itu bukan mimpi buruk untuk bekerja dengan, berkat semua generator kode ini dan spesifikasi WSDL yang berlebihan. Kami juga menemukan cara mengotomatiskan pekerjaan kotor dan menemukan cara untuk menjaga repositori kami tetap bersih dan bersih dari kode boilerplate yang tidak diinginkan. Butuh beberapa pengetahuan tentang SBT untuk mengonfigurasi urutan kompilasi & dependensi dengan benar, tetapi bagaimanapun, itu harus bekerja dengan cukup lancar. Untuk mempermudah, saya membuat templat bootstrap kecil yang akan membantu Anda memulai proyek di lain waktu: https://github.com/sainnr/sbt-scala-wsdl-template . Semoga Anda menikmati perjalanan back-to-the-past kecil ini!
Referensi
Tolong kirimkan saya pesan jika Anda melihat kesalahan ketik atau kesalahan.
Artikel ini awalnya diterbitkan di blog saya fullstackme.co.uk dengan sedikit modifikasi.