كنت أعمل مؤخرًا على عميل يتصل بخدمة ويب، وقد قمت بذلك من قبل واعتقدت أنه كان سهلاً، ومع ذلك، فإن بعض المشكلات التي واجهتها أثناء العملية جعلتني أدرك أنني ما زلت لا أعرف سوى القليل جدًا.
يتطلب جانب الخادم من خدمة الويب مصادقة الشهادة. تم إرسال الشهادة إلي بتنسيق 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، لكن خدمة الويب بتنسيق https ولا يمكن استخدامها. لاحقًا، قمت بكتابة SOAPEnvelope.toString() في كود العميل الذي تم إنشاؤه للحصول عليه، كما يلي:
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/ ">
<soapenv:الجسم>
<ns1:UPLGenerate xmlns:ns1=" http://www.alcatel-lucent.com/webService/WS_UPL ">
<OperationCode>1 </OperationCode>
<بلانت>2 </بلانت>
<QuoteNumber>3 </QuoteNumber>
<UserID>4 </UserID>
<IncludePriceType>5 </IncludePriceType>
</ns1:UPLGenerate>
</soapenv:الجسم>
</soapenv:Envelope>
في الواقع، سبب هذه المشكلة هو أن تشفير النقل الافتراضي لعميل axis2 مقسم، لذلك سيكون هناك رقمان في بداية ونهاية نص رسالة طلب الصابون، يمكنك استخدام tcpmon لاختباره. .net أو بعض الخوادم الأخرى لا تدعم هذا الوضع، نعم، فقط قم بتعيينه في الكود، كما يلي:
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);
لقد بحثت في الأمر خلال عطلة نهاية الأسبوع واستشرت أحد كبار الموظفين في الشركة للتحقق من الأمر وقدم لي بعض الاقتراحات.
اعتقدت أنه لا ينبغي أن تكون هناك مشكلة في التنفيذ الآن، ولكن هناك مشكلة أخرى.
استثناء في مؤشر الترابط "الرئيسي" 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 في كعب الروتين، وهو _returnEnv.toString(). لقد وجدت أن النتيجة التي تم إرجاعها بواسطة SoapUI كانت مختلفة لأن خدمة الويب كانت https، لذلك لا يمكن استخدامها. باستخدام tcpmon، أفهم ذلك الآن، لأن العناصر التالية في الاستجابة التي تم إرجاعها ليست موجودة دائمًا، ولكن لم يتم تعريفها في تعريف wsdl، لا يتم كتابة minOccurs = "0"، ونتيجة لذلك، إذا لم يتم جلب رمز العميل الذي تم إنشاؤه بواسطة wsdl، إذا وجدت تلك العناصر التي لم يتم إرجاعها، فسيتم الإبلاغ عن خطأ في الإضافة بشكل طبيعي minOccurs="0" إلى wsdl، وأعد إنشاء رمز العميل، واختبره، واجتازه.
في الخطوة الأخيرة، بعد النشر إلى websphere، حدث خطأ عند تنفيذ استدعاء خدمة الويب:
java.net.SocketException: لم يتم تنفيذ مآخذ التوصيل غير المتصلة
لقد كانت مشكلة في الشهادة، واستغرق الأمر عدة أيام، ثم تكرر الأمر. كان ذلك بسبب فقدان الشهادة الأصلية لهذه الشهادة، باختصار، إذا لم تتمكن من الحصول على جميع الشهادات من خلال المضيف والمنفذ في نطاق الويب، بما في ذلك الشهادات المستخدمة مباشرة إلى المرجع المصدق، الطريقة الوحيدة للشهادات هي استيراد ملف .cer. أصل المشكلة هنا: الشهادة! ! !
كانت المشكلات التي واجهتها مزعجة، لكن المكافآت لم تكن صغيرة، وفي غضون أيام قليلة، قمت بتعميق فهمي لخدمة الويب، وأشعر بالخجل من القول إنني كنت أعرف فقط كيفية استخدام المحور لكتابة الخادم. ثم استخدم wsdl لإنشاء العميل لا أعرف ما إذا كان من الممكن استخدام wsdl لإنشاء جانب الخادم. لحسن الحظ، حصلت على هذه الفرصة، وقد أحرزت تقدمًا، ويمكن للجميع تشجيعي.
-