Baru-baru ini saya sedang mengerjakan klien yang memanggil layanan web. Saya pernah melakukannya dan menurut saya itu mudah. Namun, beberapa masalah yang saya temui selama proses tersebut membuat saya menyadari bahwa saya masih tahu terlalu sedikit.
Sisi server layanan web memerlukan otentikasi sertifikat. Sertifikat telah dikirimkan kepada saya dalam format cer. Setelah menggunakan alat keytool Java untuk mengekstrak sertifikat, jalankan pernyataan berikut saat memanggil layanan web:
System.setProperty("javax.net.ssl.trustStore", "xxxx.truststore");
Beritahu server bahwa klien saya memiliki sertifikat, dan sejauh ini tidak ada masalah.
Selanjutnya, saya menggunakan wsdl2java axis2 untuk menghasilkan kode klien, tetapi kesalahan berikut terjadi segera setelah dijalankan:
org.apache.axis2.AxisFault: [ISS.0088.9125] Permintaan SOAP tidak sesuai dengan model pesan SOAP
Kesalahan ini ditemukan dalam dokumen pengembangan sabun karena format pesan sabun yang diminta salah Alamat dokumennya adalah: http://documentation.softwareag.com/webmethods/wmsuite7/Developer/Guides/7-1-1_SOAP_Developers_Guide.pdf (89 Halaman)
Saat ini pihak lain meminta saya untuk mengirimkan pesan permintaan sabun. Saya baru pada tahap menggunakan layanan web. Saya bisa menggunakan alat seperti axis dan xfire untuk menulis server dan klien, tetapi saya hanya tahu sedikit tentang sabun Saya mencari informasi di Internet dan bertanya kepada Rekan, setelah berjuang sekian lama, akhirnya saya menemukan pesan permintaan tersebut. Cara yang diberikan rekan-rekan adalah dengan menggunakan tools seperti tcp monitor, namun webservicenya berformat https dan tidak bisa digunakan. Nanti saya ketik SOAPEnvelope.toString() pada kode klien yang dihasilkan untuk mendapatkannya, sebagai berikut:
<?xml versi='1.0' pengkodean='utf-8'?>
<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/ ">
<soapenv:Tubuh>
<ns1:UPLGenerate xmlns:ns1=" http://www.alcatel-lucent.com/webService/WS_UPL ">
<Kode Operasi>1 </Kode Operasi>
<Tanaman>2 </Tanaman>
<Nomor Penawaran>3 </Nomor Penawaran>
<IDPengguna>4 </IDPengguna>
<IncludePriceType>5 </IncludePriceType>
</ns1:UPLGenerate>
</soapenv:Tubuh>
</soapenv:Amplop>
Faktanya, alasan untuk masalah ini adalah pengkodean transfer default klien axis2 terpotong, sehingga akan ada dua angka di awal dan akhir isi pesan permintaan sabun. .net atau beberapa server lain tidak mendukung mode ini. Ya, atur saja di kodenya, sebagai berikut:
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);
Saya menelitinya selama akhir pekan. Saya berkonsultasi dengan seorang senior di perusahaan untuk memeriksanya dan memberi saya beberapa saran.
Seharusnya tidak ada masalah dengan eksekusinya sekarang.
Pengecualian di thread "main" org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Subelemen tak terduga xxxxResponse
di org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
Masalah ini telah mengganggu saya selama tiga hari. Saya menemukan banyak hal di Internet. Ada yang mengatakan untuk menggunakan wstx-asl-3.2.1.jar, dll., tetapi saya mencoba semuanya dan setidaknya tidak berhasil bukan karena kesalahan ini di pihak saya. Saya sangat mendesak. Saya tidak tahu. Kemudian, saya tidak sengaja mencetak org.apache.axiom.soap.SOAPEnvelope _returnEnv di stub, yaitu _returnEnv.toString() Saya menemukan bahwa hasil yang dikembalikan oleh sabunUI berbeda karena layanan webnya https, sehingga tidak dapat digunakan. Menggunakan tcpmon, saya mengerti sekarang, karena elemen berikut dalam respons yang dikembalikan tidak selalu ada, tetapi tidak ditentukan. dalam definisi wsdl, yaitu minOccurs="0" tidak ditulis. Akibatnya, jika kode klien yang dihasilkan oleh wsdl ini tidak diambil. Jika Anda menemukan elemen yang tidak dikembalikan, kesalahan secara alami akan dilaporkan Tambahkan minOccurs="0" ke wsdl, buat ulang kode klien, uji, dan teruskan.
Pada langkah terakhir, setelah diterapkan ke websphere, terjadi kesalahan saat menjalankan panggilan layanan web:
java.net.SocketException: Soket yang tidak terhubung tidak diterapkan
Itu masalah sertifikat. Butuh waktu beberapa hari, lalu terulang kembali. Itu karena sertifikat induk dari sertifikat ini hilang. Singkatnya, jika Anda tidak bisa mendapatkan semua sertifikat melalui host dan port di websphere, termasuk sertifikat yang digunakan langsung ke otoritas sertifikat. Untuk sertifikat, satu-satunya cara adalah mengimpor file .cer. Akar masalahnya ada di sini: sertifikat! ! !
Masalah yang saya temui memang menjengkelkan, tetapi imbalannya tidak sedikit. Hanya dalam beberapa hari, saya telah memperdalam pemahaman saya tentang layanan web. Saya malu untuk mengatakan bahwa di masa lalu, saya hanya tahu cara menggunakan axis untuk menulis server. dan kemudian gunakan wsdl untuk menghasilkan klien. Saya tidak tahu apakah wsdl dapat digunakan untuk menghasilkan sisi server. Untungnya, dengan adanya kesempatan ini, saya telah membuat kemajuan, dan semua orang dapat menyemangati saya.
-