需要查看客户端与外部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");

}

现在,当我们确信retrieveMyObjectsPortjavax.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

回到顶部