Saya menggunakan Holiday Festival Qingming untuk meninjau konten yang relevan dari layanan web dan secara singkat merangkum prinsip kerjanya. Untuk referensi oleh teman yang membutuhkan dan diri mereka sendiri di masa depan. Jika ada artikel yang tidak pantas, silakan minta teman Anda untuk memberikan saran berharga untuk saling mendorong.
Dalam layanan web, pertama -tama kita harus memahami arti istilah terkait: WSDL, uddi .... Pengenalan istilah terkait tidak akan diulangi di sini, tetapi fokusnya akan pada prinsip.
Dalam layanan web, ada tiga peran: penyedia layanan, pemohon layanan dan perantara layanan. Hubungan antara ketiganya ditunjukkan pada Gambar 1-1
Menerapkan layanan web lengkap mencakup langkah -langkah berikut:
◆ Penyedia layanan web merancang dan mengimplementasikan layanan web, dan menerbitkan debugging yang benar dari layanan web melalui perantara layanan web dan mendaftarkannya di Pusat Pendaftaran UDDI; (Menerbitkan)
◆ Pemohon layanan web meminta layanan khusus dari perantara layanan web, dan perantara menanyakan pusat pendaftaran UDDI berdasarkan permintaan untuk menemukan layanan yang memenuhi permintaan; (Penemuan)
◆ Perantara layanan web mengembalikan informasi deskripsi layanan web yang memenuhi persyaratan kepada pemohon layanan web. Informasi deskripsi ditulis dalam WSDL dan dapat dibaca oleh berbagai mesin yang mendukung layanan web; (Penemuan)
◆ Gunakan informasi deskripsi (WSDL) yang dikembalikan dari perantara layanan web untuk menghasilkan pesan SOAP yang sesuai dan mengirimkannya ke penyedia layanan web untuk mewujudkan panggilan layanan web; (mengikat)
◆ Penyedia layanan web menjalankan layanan web yang sesuai sesuai dengan pesan SOAP dan mengembalikan hasil layanan ke pemohon layanan web. (Mengikat)
Gambar 1-1 Arsitektur Layanan Web
Catatan: Fungsi WSDL adalah manual layanan web. Pemohon layanan menghasilkan pesan SOAP yang sesuai berdasarkan WSDL ini. Setelah menerima pesan permintaan SOAP, penyedia layanan mengikat Layanan.
Kode berikut adalah konfigurasi servlet di web.xml
<!- Saat merumuskan parameter inisialisasi atau URL khusus untuk melayani atau halaman JSP, Anda harus memberi nama pertama halaman Servlet atau JSP. Elemen servlet digunakan untuk menyelesaikan tugas ini. -> <servlet> <servlet-name> Userservice </servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.wsservlet </servlet-kelas> <!-Tandai apakah wadah ini memuat nomor yang lebih tinggi ketika dimulainya (instan dan panggil metode init () Nilai yang lebih kecil; Nilai yang lebih kecil The Lower Pertama ketika dimulai-> <load-on-startup> 1 </boad-on-startup> </servlet> <!-server umumnya menyediakan URL default untuk servlet: http: // host/webappprefix/servlet/servlet-quault <Servlet-Mapping> <servlet-name> Userservice </servlet-name> <!-Menjelaskan URL relatif terhadap root aplikasi web. Bagian hijau adalah antarmuka eksternal layanan. Temukan file JAX-WS.XML yang sesuai (seperti yang ditunjukkan di bawah ini) <endpoint name = "userport" implementasi = "cn.ujn.service.userservice" url-pola = "/user"> </endpoint>
Ini kemudian terikat pada kelas implementasi yang relevan yang relevan cn.ujn.service.userservice. Badan Badan Pesan Permintaan SOAP yang dikirim oleh klien berisi nama metode dan informasi parameter yang diminta oleh klien.
Berikut ini adalah badan pesan SOAP yang dienkapsulasi oleh klien (transmisi data dengan server dalam mode JSON) (amplop soap request):
<Soapenv: amplop xmlns: soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: q0 = "http://ujn.cn/" xmlns: xsd = "http:/ww.cn3. xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance">- <Soapenv: Body>- <Q0: Login> <Arg0> {"quoten": "SHQ", "Kata Sandi": "SHQ"} </argan> </q0: "SHQ", "Kata Sandi": "SHQ"} </arg0> </q0 Berikut ini adalah protokol SOAP1.1 yang memohon layanan web
/*** Memanggil layanan web melalui protokol SOAP1.1** Teks/xml Ini didasarkan pada protokol SOAP1.1** @param wsdl wsdl path* @param Metode Metode Nama Metode* @param namespace* @param headerparameters headerparameters header parameter @parametmeters* @param Bodyparam @parameters @parameters @parameters @parameters* @parameters @parameters @parameters* @parameters @parameters* @parameters @parameters @param Parameter apakah ada namespace untuk parameter tubuh * @return string * @throws Exception */ public static String invokebysoap11 (string wsdl, metode string, string namespace, peta <string, string> headerparameters, peta <string, string> bodyparameters, boolean isbodyparametersns; // hapus? Wsdl, dapatkan daftar metode int int = wsdl.length (); wsdl = wsdl.substring (0, panjang - 5); // Buat instance url dengan string sebagai parameter url url = URL baru (wsdl); // Buat koneksi httpurlConnection conn = (httpurlconnection) url.openconnection (); // atur metode permintaan conn.setRequestMethod ("post"); // Jika Anda berencana untuk menggunakan koneksi URL untuk input, atur flag doinput ke conn.setDoInput true (true); // Jika Anda berencana untuk menggunakan koneksi URL untuk output, atur bendera doInput ke conn.setDoOutput true (true); // Terutama atur atribut (kV) di header permintaan httpurlConnection conn.setRequestProperty ("tipe konten", "teks/xml; charset = utf-8"); // Dapatkan aliran input (relatif ke klien, gunakan outputStream) outputStream out = conn.getoutputStream (); // Dapatkan pesan versi SOAP1.1 StringBuilder SB = New StringBuilder (); SB.Append ("<SOAP: amplop xmlns: xsi =/" http://www.w3.org/2001/xmlschema-instance/ "xmlns: xsd =/" http://www.w3.org/2001/xmlschema/www.w3.org/2001/xmlschema/ " xmlns: soap =/"http://schemas.xmlsoap.org/soap/envelope//" "); SB.Append ("xmlns: ns0 =/" " + namespace +"/""); SB.Append (">"); // rakit header pesan if (headerparameters! = Null) {sb.append ("<soap: header>"); untuk (entri <string, string> headerParameter: headerparameters .Entryset ()) {sb.append ("<ns0:"); SB.Append (headerparameter.getKey ()); SB.Append (">"); SB.Append (headerparameter.getValue ()); SB.Append ("</ns0:"); SB.Append (headerparameter.getKey ()); SB.Append (">"); } sb.append ("</soap: header>"); } // rakit pesan pesan sb.append ("<soap: body> <ns0:"); SB.Append (Metode); SB.Append (">"); // Parameter input if (bodyparameters! = Null) {for (entri <string, string> inputparameter: bodyparameters .Entryset ()) {if (isBodyparametersns) {sb.append ("<ns0:"); SB.Append (inputparameter.getKey ()); SB.Append (">"); SB.Append (inputparameter.getValue ()); SB.Append ("</ns0:"); SB.Append (inputparameter.getKey ()); SB.Append (">"); } else {sb.append ("<"); SB.Append (inputparameter.getKey ()); SB.Append (">"); SB.Append (inputparameter.getValue ()); SB.Append ("</"); SB.Append (inputparameter.getKey ()); SB.Append (">"); }}} sb.append ("</ns0:"); SB.Append (Metode); SB.Append ("> </soap: body> </soap: envelope>"); // uji system.out.println (sb.tostring ()); // Tulis pesan SOAP (relatif terhadap klien, out.write () digunakan) out.write (sb.tostring (). GetBytes ()); // Dapatkan kode int yang sesuai di sisi server = conn.getResponsecode (); if (code == 200) {inputStream adalah = conn.getInputStream (); byte [] b = byte baru [1024]; int len = 0; soapOfResult = New StringBuffer (); // Baca sejumlah byte dari aliran input dan simpan di array buffer b. Mengembalikan jumlah aktual byte yang dibaca sebagai integer // jika tidak ada byte yang tersedia karena aliran berada di akhir file, nilainya -1; while ((len = is.read (b))! = -1) {// Mengubah array byte menjadi string menggunakan charset bernama. String s = string baru (b, 0, len, "utf-8"); SoapOfResult.Append (S); }} conn.disconnect (); mengembalikan soapofresult == null? null: soapofresult.tostring (); } Catatan: Klien diblokir setelah mengirim pesan permintaan SOAP. Sampai server mengembalikan kode status.
Berikut ini adalah respons server (amplop respons sabun):
<S: amplop xmlns: s = "http://schemas.xmlsoap.org/soap/envelope/">-<s: body>-<ns2: loginResponse xmlns: ns2 = "http://ujn.cn/"> <return> 1 </s: body> </s: amplope>
Setelah menerima data JSON yang dikirim oleh server, klien akan melakukan operasi parsing yang sesuai. sebagai berikut:
// Parse protokol SOAP (dom parsing hanya dapat digunakan untuk parse jenis dokumen XML, sedangkan pesan SOAP berada dalam format data XML) dokumen Doc = xmlutil.string2doc (hasil); Elemen ele = (elemen) doc.geteLementsbyTagname ("return"). Item (0); Metode String2Doc () yang digunakan dalam metode ini adalah sebagai berikut: Dokumen statis public string2doc (string str) {// parse dokumen XML ke dalam DOCH Tree DocumentBuilderFactory factory = DocumentBuilderFactory.NewInstance (); Dokumen dokumen = null; DocumentBuilder build; if (str == null || str.equals ("")) {return null; } coba {inputStream bais = new ByteArrayInputStream (str.getbytes ("UTF-8")); build = factory.newDocumentBuilder (); // Parsen konten inputstream yang diberikan sebagai dokumen XML dan kembalikan objek dokumen DOM baru. Dokumen = build.parse (BAIS); } catch (Exception e) {E.PrintStackTrace (); } return document; } Menurut hasil pengembalian, klien akan melakukan pemrosesan yang sesuai.
Di atas adalah prinsip kerja dasar layanan web.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!