需要查看客户端的SOAP消息交谈外部Web服务 - 如何? (Eclipse的/ Netbeans的/ IDEA OK)
-
19-09-2019 - |
题
我有一个情况下,我必须用Java编写客户端对一个非常挑剔的外部Web服务(通过HTTPS),我可以跟在Eclipse的Java EE通过Web服务管理器中的Web服务。
不幸的是,我不能让客户问正确,所以我真的很想看到SOAP消息来回。作为新的Web服务,这是一个有点丛林。我很熟悉Eclipse,并且已经花了一些时间使用Netbeans和IntelliJ。
我真的,真的喜欢使用地铁堆栈,因为它允许这对一只股票的Java 6上运行,并部署规模的问题。有一个简单的方法,使地铁登录它做什么,或做它通过在Eclipse和Netbeans的TCP / IP监控说话吗?地铁文件似乎是主要针对Web服务的作者,而不是客户端,所以我可能很容易错过了。
有关的设置说任何建议,“这里是WSDL - 生成我的客户,我可以看交通”?
解决方案 3
这是有帮助的打开与
登录-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
我们可以通过每个期望的web服务端口接口上调用下面的方法使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);
希望这有助于
不隶属于 StackOverflow