ฉันใช้วันหยุดเทศกาลชิงมิงเพื่อตรวจสอบเนื้อหาที่เกี่ยวข้องของบริการเว็บและสรุปหลักการทำงานสั้น ๆ สำหรับการอ้างอิงโดยเพื่อนที่ต้องการและตัวเองในอนาคต หากมีบทความที่ไม่เหมาะสมใด ๆ โปรดขอให้เพื่อนของคุณให้คำแนะนำที่มีค่าเพื่อสนับสนุนซึ่งกันและกัน
ในบริการเว็บเราควรเข้าใจความหมายของคำศัพท์ที่เกี่ยวข้องก่อน: WSDL, UDDI .... การแนะนำคำที่เกี่ยวข้องจะไม่เกิดขึ้นที่นี่ แต่จะเน้นไปที่หลักการ
ในบริการเว็บมีสามบทบาท: ผู้ให้บริการผู้ร้องขอบริการและตัวกลางบริการ ความสัมพันธ์ระหว่างทั้งสามแสดงในรูปที่ 1-1
การใช้บริการเว็บที่สมบูรณ์รวมถึงขั้นตอนต่อไปนี้:
◆ผู้ให้บริการเว็บออกแบบและใช้บริการบนเว็บและเผยแพร่การดีบักที่ถูกต้องของบริการเว็บผ่านตัวกลางบริการเว็บและลงทะเบียนในศูนย์ลงทะเบียน UDDI (เผยแพร่)
◆ผู้ร้องขอบริการเว็บร้องขอบริการเฉพาะจากตัวกลางบริการเว็บและการสอบถามตัวกลางที่ศูนย์ลงทะเบียน UDDI ตามคำขอเพื่อค้นหาบริการที่ตรงตามคำขอ (การค้นพบ)
◆ตัวกลางบริการเว็บส่งคืนข้อมูลคำอธิบายบริการเว็บที่ตรงตามเงื่อนไขไปยังผู้ร้องขอบริการเว็บ ข้อมูลคำอธิบายถูกเขียนใน WSDL และสามารถอ่านได้ด้วยเครื่องจักรต่าง ๆ ที่สนับสนุนบริการเว็บ (การค้นพบ)
◆ใช้ข้อมูลคำอธิบาย (WSDL) ที่ส่งคืนจากตัวกลางบริการเว็บเพื่อสร้างข้อความ SOAP ที่สอดคล้องกันและส่งไปยังผู้ให้บริการเว็บเพื่อรับรู้การโทรของบริการเว็บ (ผูกพัน)
◆ผู้ให้บริการเว็บดำเนินการบริการเว็บที่เกี่ยวข้องตามข้อความ SOAP และส่งคืนผลลัพธ์บริการไปยังผู้ร้องขอบริการเว็บ (ผูกพัน)
รูปที่ 1-1 สถาปัตยกรรมบริการเว็บ
หมายเหตุ: ฟังก์ชั่นของ WSDL เป็นคู่มือบริการเว็บ ผู้ร้องขอบริการสร้างข้อความ SOAP ที่สอดคล้องกันตาม WSDL นี้ หลังจากได้รับข้อความร้องขอ SOAP ผู้ให้บริการจะผูกมัดบริการ
รหัสต่อไปนี้คือการกำหนดค่า servlet ใน web.xml
<!- เมื่อกำหนดพารามิเตอร์การเริ่มต้นหรือ URL ที่กำหนดเองไปยังหน้า servlet หรือ jsp คุณต้องตั้งชื่อหน้า servlet หรือ jsp เป็นอันดับแรก องค์ประกอบ servlet ใช้เพื่อทำภารกิจนี้ให้เสร็จสมบูรณ์ -> <servlet> <servlet-name> userservice </servlet-name> <servlet-lass> com.sun.xml.ws.transport.http.servlet.wsservlet </servlet-class> <! แอปพลิเคชันก่อนที่จะเริ่มต้น-> <load-on-startup> 1 </load-on-startup> </servlet> <! <servlet-mapping> <servlet-name> userservice </servlet-name> <!-อธิบาย URL ที่สัมพันธ์กับรูทของเว็บแอปพลิเคชัน ส่วนสีเขียวเป็นอินเทอร์เฟซภายนอกของบริการ ค้นหาไฟล์ jax-ws.xml ที่เกี่ยวข้อง (ดังที่แสดงด้านล่าง) <endpoint name = "userport" การใช้งาน = "cn.ujn.service.userService" url-pattern = "/user"> </endpoint>
จากนั้นจะถูกผูกไว้กับคลาสการใช้งานที่เกี่ยวข้องที่เกี่ยวข้อง cn.ujn.service.userservice เนื้อหาข้อความร้องขอ SOAP ที่ลูกค้าส่งโดยลูกค้ามีชื่อวิธีและข้อมูลพารามิเตอร์ที่ลูกค้าร้องขอ
ต่อไปนี้เป็นข้อความ SOAP Message ที่ถูกห่อหุ้มโดยไคลเอนต์ (การส่งข้อมูลกับเซิร์ฟเวอร์ในโหมด JSON) (ซองจดหมาย Rerquest SOAP):
<SOAPENV: ซอง XMLNS: SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: q0 = "http://ujn.cn/" xmlns: xsd = "http:/ http:/ http:/ http:/ http xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance">- <soapenv: body>- <q0: เข้าสู่ระบบ> <grag0> {"ชื่อผู้ใช้": "shq", "รหัสผ่าน": "shq"} </soapenv: ซองจดหมาย> ต่อไปนี้เป็นโปรโตคอล SOAP1.1 ที่เรียกใช้บริการเว็บ
/*** เรียกใช้บริการเว็บผ่านโปรโตคอล SOAP1.1** ข้อความ/XML นี่เป็นไปตามโปรโตคอล SOAP1.1** @param WSDL WSDL PATH* @Param เมธอดวิธีการชื่อ* @param Namespace Namespace* @param พารามิเตอร์ไม่ว่าจะมีเนมสเปซสำหรับพารามิเตอร์ตัวถัง * @return สตริง * @throws ยกเว้น */ สตริงคงที่สาธารณะ invokebysoap11 (สตริง wsdl, วิธีการสตริง, namespace สตริง, แผนที่ <สตริง, สตริง> headerParameters, แผนที่ <สตริง, สตริง> bodyparameters, boolean // ลบ? wsdl รับรายการวิธีการความยาว int = wsdl.length (); WSDL = WSDL.SUBSTRING (0, ความยาว - 5); // สร้างอินสแตนซ์ URL ด้วยสตริงเป็นพารามิเตอร์ URL URL = URL ใหม่ (WSDL); // สร้างการเชื่อมต่อ httpurlconnection conn = (httpurlconnection) url.openconnection (); // ตั้งค่าวิธีการร้องขอ conn.setRequestMethod ("โพสต์"); // หากคุณวางแผนที่จะใช้การเชื่อมต่อ URL สำหรับอินพุตให้ตั้งค่าธง doinput เป็น true conn.setDoInput (จริง); // หากคุณวางแผนที่จะใช้การเชื่อมต่อ URL สำหรับเอาต์พุตให้ตั้งค่าสถานะ doInput เป็น true conn.setDoOutput (จริง); // ส่วนใหญ่ตั้งค่าแอตทริบิวต์ (kv) ในส่วนหัวคำขอ httpurlConnection conn.setRequestProperty ("ประเภทเนื้อหา", "text/xml; charset = utf-8"); // รับกระแสอินพุต (เทียบกับไคลเอนต์ใช้ outputStream) outputStream out = conn.getOutputStream (); // รับ SOAP1.1 เวอร์ชันข้อความ StringBuilder sb = new StringBuilder (); SB.Append ("<SOAP: ซองจดหมาย XMLNS: XSI =/" http://www.w3.org/2001/xmlschema-instance/ "xmlns: xsd =/" http://www.w3.org/2001/xmlschema/ XMLNS: SOAP =/"http://schemas.xmlsoap.org/soap/envelope//" "); sb.append ("xmlns: ns0 =/" " + เนมสเปซ +"/""); sb.append (">"); // ประกอบส่วนหัวข้อความถ้า (headerParameters! = null) {sb.append ("<soap: header>"); สำหรับ (รายการ <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>"); } // รวบรวมข้อความข้อความ sb.append ("<soap: body> <ns0:"); SB.Append (วิธีการ); sb.append (">"); // อินพุตพารามิเตอร์ถ้า (bodyParameters! = null) {สำหรับ (รายการ <สตริง, สตริง> อินพุตพารามิเตอร์: bodyParameters .ENTRYSET ()) {ถ้า (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 (วิธีการ); sb.append ("> </soap: body> </soap: envelope>"); // test system.out.println (sb.toString ()); // เขียนข้อความสบู่ (สัมพันธ์กับไคลเอนต์, out.write ()) out.write (sb.toString (). getBytes ()); // รับรหัส int ที่สอดคล้องกันบนฝั่งเซิร์ฟเวอร์ = conn.getResponsecode (); if (code == 200) {inputStream คือ = conn.getInputStream (); ไบต์ [] b = ไบต์ใหม่ [1024]; int len = 0; SOAPOFRESULT = new StringBuffer (); // อ่านจำนวนไบต์จำนวนหนึ่งจากสตรีมอินพุตและเก็บไว้ในอาร์เรย์บัฟเฟอร์ b ส่งคืนจำนวนไบต์จริงที่อ่านเป็นจำนวนเต็ม // หากไม่มีไบต์ใช้งานได้เนื่องจากสตรีมอยู่ที่ส่วนท้ายของไฟล์ค่าคือ -1; ในขณะที่ ((len = is.read (b))! = -1) {// แปลงอาร์เรย์ไบต์เป็นสตริงโดยใช้ charset ที่มีชื่อ สตริง s = สตริงใหม่ (b, 0, len, "utf-8"); SOAPOFRESULT.Append (S); }} conn.disconnect (); ส่งคืน SOAPOFRESULT == NULL? NULL: SOAPOFRESULT.TOSTRING (); - หมายเหตุ: ไคลเอนต์ถูกบล็อกหลังจากส่งข้อความร้องขอ SOAP จนกว่าเซิร์ฟเวอร์จะส่งคืนรหัสสถานะ
ต่อไปนี้คือการตอบสนองของเซิร์ฟเวอร์ (ซองจดหมายตอบกลับ SOAP):
<S: ซอง XMLNS: S = "http://schemas.xmlsoap.org/soap/envelope/">-<s: body>-<ns2: loginResponse xmlns: ns2 = "http://ujn.cn </s: body> </s: ซองจดหมาย>
หลังจากได้รับข้อมูล JSON ที่ส่งโดยเซิร์ฟเวอร์ไคลเอนต์จะดำเนินการแยกวิเคราะห์ที่สอดคล้องกัน ดังนี้:
// แยกวิเคราะห์โปรโตคอล SOAP (การแยกวิเคราะห์ DOM สามารถใช้เพื่อแยกวิเคราะห์ประเภทเอกสาร XML ในขณะที่ข้อความ SOAP อยู่ในรูปแบบข้อมูล XML) เอกสารเอกสาร = XMLUTIL.STRING2DOC (ผลลัพธ์); Element Ele = (องค์ประกอบ) doc.getElementByTagname ("return"). รายการ (0); เมธอด String2Doc () ที่ใช้ในวิธีนี้มีดังนี้: เอกสารคงที่เอกสารสาธารณะ String2Doc (String Str) {// แยกวิเคราะห์เอกสาร XML ลงใน DOM Tree DocumentBuilderFactory โรงงาน = DocumentBuilderFactory.NewInstance (); เอกสารเอกสาร = null; DocumentBuilder Build; if (str == null || str.equals ("")) {return null; } ลอง {inputStream bais = ใหม่ byteArrayInputStream (str.getBytes ("UTF-8")); build = Factory.newDocumentBuilder (); // แยกวิเคราะห์เนื้อหาของอินพุตที่กำหนดเป็นเอกสาร XML และส่งคืนวัตถุเอกสาร DOM ใหม่ เอกสาร = build.parse (bais); } catch (exception e) {e.printstacktrace (); } ส่งคืนเอกสาร; - ตามผลการส่งคืนลูกค้าจะดำเนินการประมวลผลที่สอดคล้องกัน
ข้างต้นเป็นหลักการทำงานพื้นฐานของบริการเว็บ
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!