我想使用JAXWS在java中构建一个soap客户端。我在谷歌搜索但没有找到任何相关信息。这是我尝试过的:
QName serviceName = new QName("urn:Site", "Site");
QName portName = new QName("urn:Site", "Server_HandlerPort");
String endpointAddress = "http://myhost/url/soap";
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
BindingProvider bp = (BindingProvider) dispatch;
MessageFactory factory = ((SOAPBinding) bp.getBinding()).getMessageFactory();
SOAPMessage request = factory.createMessage();
SOAPHeader header = request.getSOAPHeader();
SOAPBody body = request.getSOAPBody();
QName payloadName = new QName("session");
SOAPBodyElement payload = body.addBodyElement(payloadName);
SOAPMessage reply = null;
try {
reply = dispatch.invoke(request);
} catch (WebServiceException wse){
wse.printStackTrace();
}
body = reply.getSOAPBody();
QName responseName = new QName("urn:site","sessionResponse");
SOAPBodyElement bodyElement = (SOAPBodyElement) body.getChildElements(responseName).next();
System.out.println(bodyElement.getValue());
这不起作用。这总是返回null
我不知道为什么?谁可以帮我这个事?任何例子?做这样的事情?
答案 0 :(得分:5)
JAX-WS允许您使用wsimport从Web服务的WSDL生成客户端。 这将使客户端代码更加简单。 这是一个示例tutorial
答案 1 :(得分:0)
根据我的注意,响应的dispatch.invoke
中发生的解组不会填充来自SOAPMessage
的正文,信封等,而是会创建一个内部Document
已链接到SOAPPart
。
如果在调用调用后调用reply.writeTo(System.out)
,它会将完整的响应消息打印到控制台中。
您可以浏览Document
(在这种情况下实际上是根Element
)并获取sessionResponse
。这是一段代码:
NodeList nodeList = reply.getSOAPPart().getDocumentElement().getElementsByTagNameNS("urn:site", "sessionResponse");
Node node = nodeList.item(0);
现在,根据响应的结构,您可能需要在树中进行一些导航。我们假设你的回答是这样的:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:sessionResponse xmlns:ns2="urn:site">
<return>Hello World!</return>
</ns2:sessionResponse >
</S:Body>
</S:Envelope>
为了获得返回值,您将调用:
System.out.println(node.getFirstChild().getFirstChild().getNodeValue());
return
节点text
节点如果您需要来自Document
的{{1}}对象而不是Element
对象,则需要将SOAPPart
转换为SOAPPart
:
SOAPPartImpl