เมื่อเร็วๆ นี้ฉันกำลังทำงานกับไคลเอนต์ที่เรียกใช้บริการทางเว็บ ฉันเคยทำมาก่อนและคิดว่ามันง่าย อย่างไรก็ตาม ปัญหาบางอย่างที่ฉันพบในระหว่างกระบวนการทำให้ฉันรู้ว่าฉันยังรู้น้อยเกินไป
ฝั่งเซิร์ฟเวอร์ของบริการเว็บต้องมีการตรวจสอบสิทธิ์ใบรับรอง ใบรับรองถูกส่งถึงฉันในรูปแบบ cer หลังจากใช้เครื่องมือ Java keytool เพื่อแยกใบรับรอง ให้ดำเนินการคำสั่งต่อไปนี้เมื่อเรียกใช้บริการเว็บ:
System.setProperty("javax.net.ssl.trustStore", "xxxx.truststore");
แจ้งเซิร์ฟเวอร์ว่าไคลเอนต์ของฉันมีใบรับรอง และจนถึงขณะนี้ก็ไม่มีปัญหา
ต่อไป ฉันใช้ wsdl2java ของ axis2 เพื่อสร้างโค้ดไคลเอ็นต์ แต่เกิดข้อผิดพลาดต่อไปนี้ทันทีที่ดำเนินการ:
org.apache.axis2.AxisFault: [ISS.0088.9125] คำขอ SOAP ไม่สอดคล้องกับโมเดลข้อความ SOAP
พบข้อผิดพลาดนี้ในเอกสารการพัฒนาสบู่เนื่องจากรูปแบบข้อความสบู่ที่ร้องขอไม่ถูกต้อง ที่อยู่เอกสารคือ: http://documentation.softwareag.com/webmethods/wmsuite7/Developer/Guides/7-1-1_SOAP_Developers_Guide.pdf (89 หน้าหนังสือ)
ในเวลานี้อีกฝ่ายขอให้ฉันส่งข้อความขอสบู่ ฉันอยู่ในขั้นตอนของการใช้บริการเว็บเท่านั้น ฉันสามารถใช้เครื่องมือเช่น axis และ xfire เพื่อเขียนเซิร์ฟเวอร์และไคลเอนต์ได้ แต่ฉันรู้เพียงเล็กน้อยเกี่ยวกับสบู่ ฉันค้นหาข้อมูลบนอินเทอร์เน็ตและถามเพื่อนร่วมงาน หลังจากดิ้นรนอยู่นาน ในที่สุดฉันก็พบข้อความคำขอ วิธีที่เพื่อนร่วมงานให้ไว้คือการใช้เครื่องมือ เช่น tcp monitor แต่บริการเว็บอยู่ในรูปแบบ https และไม่สามารถใช้ได้ ต่อมาฉันพิมพ์ SOAPEnvelope.toString() ในโค้ดไคลเอ็นต์ที่สร้างขึ้นเพื่อรับมัน ดังนี้:
<?xml version='1.0' encoding='utf-8'?>
<soapenv:ซองจดหมาย xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/ ">
<สบู่เพนวี:ร่างกาย>
<ns1:UPLสร้าง xmlns:ns1=" http://www.alcatel-lucent.com/webService/WS_UPL ">
<รหัสปฏิบัติการ>1 </รหัสปฏิบัติการ>
<พืช>2 </พืช>
<QuoteNumber>3 </QuoteNumber>
<รหัสผู้ใช้>4 </รหัสผู้ใช้>
<รวมประเภทราคา>5 </รวมประเภทราคา>
</ns1:UPLสร้าง>
</สบู่เพนฟ:ร่างกาย>
</soapenv:ซองจดหมาย>
ที่จริงแล้ว สาเหตุของปัญหานี้ก็คือ การเข้ารหัสการถ่ายโอนเริ่มต้นของไคลเอนต์ axis2 นั้นเป็นก้อน ดังนั้นจะมีตัวเลขสองตัวที่จุดเริ่มต้นและจุดสิ้นสุดของข้อความคำขอ Soap คุณสามารถใช้ tcpmon เพื่อทดสอบได้ .net หรือเซิร์ฟเวอร์อื่นๆ บางตัวไม่รองรับโหมดนี้ ใช่ เพียงตั้งค่าไว้ในโค้ดดังนี้:
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);
ฉันค้นคว้าข้อมูลในช่วงสุดสัปดาห์ ฉันปรึกษาผู้อาวุโสในบริษัทเพื่อตรวจสอบและให้คำแนะนำแก่ฉัน ขอบคุณมาก!
ฉันคิดว่าการประหารชีวิตไม่น่าจะมีปัญหาอีกต่อไป แต่มีปัญหาอื่นอีก
ข้อยกเว้นในเธรด "main" org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: องค์ประกอบย่อยที่ไม่คาดคิด xxxxResponse
ที่ org.apache.axis2.AxisFault.makeFault (AxisFault.java:430)
ปัญหานี้กวนใจฉันมาสามวันแล้ว ฉันพบอะไรมากมายบนอินเทอร์เน็ต บางคนบอกว่าให้ใช้ wstx-asl-3.2.1.jar ฯลฯ แต่ฉันลองทั้งหมดแล้ว แต่อย่างน้อยมันก็ไม่ได้ผล ไม่ใช่เพราะข้อผิดพลาดนี้ ฉันเร่งด่วนมาก ฉันไม่มีเบาะแส ต่อมาฉันพิมพ์ org.apache.axiom.soap.SOAPEnvelope _returnEnv ออกมาใน stub ซึ่งก็คือ _returnEnv.toString() ฉันพบว่าผลลัพธ์ที่ส่งคืนโดย SoapUI นั้นแตกต่างออกไปเนื่องจากบริการเว็บเป็น https ดังนั้นจึงไม่สามารถใช้งานได้ในขณะนี้ ฉันเข้าใจแล้วเนื่องจากองค์ประกอบต่อไปนี้ในการตอบกลับไม่ได้อยู่ที่นั่นเสมอไป แต่ไม่ได้กำหนดไว้ ในคำจำกัดความของ wsdl นั่นคือ minOccurs="0" จะไม่ถูกเขียน ดังนั้น หากรหัสไคลเอ็นต์ที่สร้างโดย wsdl นี้ไม่ได้รับการดึงข้อมูล หากคุณพบองค์ประกอบเหล่านั้นที่ไม่ได้ส่งคืน ข้อผิดพลาดจะถูกรายงานโดยธรรมชาติ minOccurs="0" ไปยัง wsdl สร้างโค้ดไคลเอ็นต์ใหม่ ทดสอบ และผ่าน
ในขั้นตอนสุดท้าย หลังจากปรับใช้กับ websphere เกิดข้อผิดพลาดขณะดำเนินการเรียกบริการเว็บ:
java.net.SocketException: ไม่ได้ใช้ซ็อกเก็ตที่ไม่ได้เชื่อมต่อ
มันเป็นปัญหาใบรับรอง ใช้เวลาหลายวัน และเกิดซ้ำ เป็นเพราะใบรับรองหลักของใบรับรองนี้หายไป หากคุณไม่สามารถรับใบรับรองทั้งหมดผ่านโฮสต์และพอร์ตในเว็บสเฟียร์ได้ รวมถึงใบรับรองที่ใช้ด้วย ไปยังผู้ออกใบรับรองโดยตรง สำหรับใบรับรอง วิธีเดียวคือการนำเข้าไฟล์ .cer สาเหตุของปัญหาอยู่ที่นี่: ใบรับรอง! - -
ปัญหาที่ฉันพบนั้นน่ารำคาญ แต่ผลตอบแทนก็ไม่น้อย ในเวลาเพียงไม่กี่วัน ฉันก็เข้าใจเว็บเซอร์วิสมากขึ้น ฉันละอายใจที่จะบอกว่าเมื่อก่อนฉันรู้แค่วิธีใช้แกนในการเขียนเซิร์ฟเวอร์ แล้วใช้ wsdl เพื่อสร้างไคลเอนต์ ฉันไม่รู้ว่า wsdl สามารถใช้เพื่อสร้างฝั่งเซิร์ฟเวอร์ได้หรือไม่ โชคดีที่ได้รับโอกาสนี้ ฉันมีพัฒนาการที่ดีขึ้น และทุกคนสามารถให้กำลังใจฉันได้
-