بحاجة إلى رؤية رسائل الصابون للعميل التحدث إلى خدمة الويب الخارجية - كيف؟ (الكسوف / Netbeans / فكرة موافق)
-
19-09-2019 - |
سؤال
لدي موقف يجب أن أكتب عميلا في Java مقابل خدمة ويب خارجية صعبة للغاية (عبر HTTPS) ويمكنني التحدث إلى خدمة الويب من خلال مستكشف خدمات الويب في Eclipse Java EE.
لسوء الحظ، لا يمكنني الحصول على العميل أن أسأل بشكل صحيح حتى أود حقا أن أرى رسائل الصابون جيئة وذهابا. أن تكون جديدا في خدمات الويب هذا قليلا من الغابة. أنا على دراية جدا بالكتف، وقد أمضيت بعض الوقت مع Netbeans و Intellij.
سأفضل ذلك حقا استخدام مكدس المترو لأنه يسمح بذلك بتشغيله على جافا 6، وحجم النشر المسائل. هل هناك طريقة بسيطة لجعل المترو سجل ما يفعله، أو جعله يتحدث من خلال شاشات TCP / IP في الكسوف والشبكي؟ يبدو أن وثائق المترو مستهدفة في المقام الأول في مؤلف خدمة الويب وليس العميل، لذلك قد أفتقدها بسهولة.
أي اقتراحات لإعداد القول "هنا هو WSDL - إنشاء عميل لي حيث يمكنني رؤية حركة المرور"؟
المحلول 3
كان من المفيد تشغيل تسجيل
-Dcom.sun.xml.ws.assembler.client=true
في تكوين الإطلاق Eclipse.
نصائح أخرى
فقط ضع وكيل أو شاشة TCP "في الوسط" وسترى الرسالة.
لقد كنت تستخدم Tcpmon. لمهمة مماثلة.
فيما يلي طريقة أخرى لمراقبة رسائل الصابون:
يبدو أن يفترض فئات العميل التي تم إنشاؤها:
// generated service class
public class MyWebServiceClient extends javax.xml.ws.Service {
// ...
private final QName portName = "...";
// ...
public RetrieveMyObjects getRetrieveMyObjects() {
return super.getPort(portName, RetrieveMyObject.class);
}
// ...
}
// generated port interface
// annotations here
public interface RetrieveMyObjects {
// annotations here
List<MyObject> getAll();
}
الآن، عند تنفيذ التعليمات البرمجية التالية:
MyWebServiceClient wsClient = new MyWebServiceClient("wsdl/location/url/here.wsdl");
RetrieveMyObjectsPort retrieveMyObjectsPort = wsClient.getRetrieveMyObjects();
wsClient
يجب إرجاع المثيل الذي هو مثيل RetrieveMyObjects
& javax.xml.ws.BindingProvider
واجهات. لم يتم ذكره في أي مكان على سطح JAX-WS، ولكن يبدو أن الكثير من التعليمات البرمجية يعتمد على تلك الحقيقة. يمكن للمرء إعادة تأكيده نفسها عن طريق تنفيذ شيء مثل:
if(!(retrieveMyObjectsPort instanceof javax.xml.ws.BindingProvider)) {
throw new RuntimeException("retrieveMyObjectsPort is not instance of " + BindingProvider.class + ". Redirect following as well as authentication is not possible");
}
الآن، عندما نتأكد من ذلك retrieveMyObjectsPort
هل مثيل javax.xml.ws.BindingProvider
يمكننا تمكين SOAPMessage
تسجيل من خلال استدعاء الطريقة التالية على كل واجهة منفذ خدمة الويب المطلوبة:
/**
* Enables logging of send and received SOAP messages on the specified {@link BindingProvider}s
*/
private static void enableSoapMessageLogging(final Logger logger, final BindingProvider... bindingProviders) {
for(final BindingProvider bindingProvider : bindingProviders) {
final List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
handlerChain.add(new SOAPHandler<SOAPMessageContext>() {
@Override
public boolean handleMessage(final SOAPMessageContext context) {
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
context.getMessage().writeTo(baos);
logger.trace(new String(baos.toByteArray()));
} catch(final Exception e) {
logger.error("", e);
}
return true;
}
@Override
public boolean handleFault(final SOAPMessageContext context) {
return true;
}
@Override
public void close(final MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
});
bindingProvider.getBinding().setHandlerChain(handlerChain);
}
}
// and somewhere at the beginning of application ...
enableSoapMessageLogging(logger, (BindingProvider) retrieveMyObjectsPort);
أتمنى أن يساعدك هذا