需要查看客户端与外部Web服务交谈的SOAP消息 - 如何? (Eclipse/Netbeans/IDEA ok)
我有一种情况,我必须在Java中针对非常挑剔的外部Web服务(通过https)编写客户端,并且我可以通过Eclipse Java中的Web服务资源管理器与Web服务交谈EE。需要查看客户端与外部Web服务交谈的SOAP消息 - 如何? (Eclipse/Netbeans/IDEA ok)
不幸的是,我不能让客户端正确询问,所以我真的很想看到SOAP消息来回传递。作为网络服务的新手,这是一个丛林。我对Eclipse非常熟悉,并且花费了一些时间与Netbeans和IntelliJ。
我真的很喜欢使用Metro堆栈,因为它允许它在库存Java 6上运行,并且部署大小很重要。是否有一种简单的方法可以让Metro日志记录它的功能,或者通过Eclipse和Netbeans中的TCP/IP监视器进行通话? Metro文档似乎主要针对Web服务作者,而不是客户端,所以我可能很容易错过它。
有关安装程序的任何建议“这里是WSDL - 生成一个我可以看到流量的客户端”?
回答:
这是大有裨益的
-Dcom.sun.xml.ws.assembler.client=true
在Eclipse启动配置 启用日志记录。
回答:
只需将代理或tcp监视器“放在中间”即可看到该消息。
我一直在使用tcpmon进行类似的任务。
回答:
这里是另一种方式来观察SOAP消息:
假设生成的客户端类的样子:现在
// 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);
希望这有助于
以上是 需要查看客户端与外部Web服务交谈的SOAP消息 - 如何? (Eclipse/Netbeans/IDEA ok) 的全部内容, 来源链接: utcz.com/qa/261402.html