我的任务是查询java中的soap客户端,我对如何继续前进感到有点困惑。
我做的第一件事就是使用Wizdler chrome插件来构建我的SOAP请求的原型。肥皂“信封”必须是我认为可以使用的格式。
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
<Body>
<GetMyProjectCharges xmlns="http://COMPANY.IWWeb.Data.Service.ProjectCharges">
<Employee>[string?]</Employee>
<FiscalYear>[string?]</FiscalYear>
<ApiKey>[string?]</ApiKey>
<AppName>[string?]</AppName>
</GetMyProjectCharges>
</Body>
</Envelope>
接下来我已经经历了一些各种教程,如何在java中构建一个肥皂包,但我一直陷入一种奇怪的情况,我在所有内容上都获得<SOAP-ENV:
前缀,当我采用生成的信封时尝试将其粘贴到Chrome插件中,但它不起作用。
所以我想知道我从哪里开始?我意识到肥皂是一个非常繁重的协议,所以也许这让我感到困惑,但我现在想做的是(现在):
1)在java中生成与上述格式匹配的soap请求,并打印出结果。
我理解我“可能”可以选择Maven或某些程序从WDSL为我生成一些类文件,但我不确定我是怎么做的。谢谢!
任何帮助都将不胜感激。
答案 0 :(得分:1)
我不确定我是否明白了。无论如何,我认为你需要为你的肥皂消息提供正确的命名空间。空白SOAP消息如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
所以在你的情况下,我认为这应该有效:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<GetMyProjectCharges xmlns="http://COMPANY.IWWeb.Data.Service.ProjectCharges">
<Employee>[string?]</Employee>
<FiscalYear>[string?]</FiscalYear>
<ApiKey>[string?]</ApiKey>
<AppName>[string?]</AppName>
</GetMyProjectCharges>
</soapenv:Body>
</soapenv:Envelope>
但通常你也会在有效负载中使用一个命名空间(这意味着 GetMyProjectCharges 就像 jeef:GetMyProjectCharges )。
在根标记中查看第二个名称空间
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:jeef="http://COMPANY.IWWeb.Data.Service.ProjectCharges">
<soapenv:Header/>
<soapenv:Body>
<jeef:GetMyProjectCharges>
<jeef:Employee>[string?]</jeef:Employee>
<jeef:FiscalYear>[string?]</jeef:FiscalYear>
<jeef:ApiKey>[string?]</jeef:ApiKey>
<AppName>[string?]</jeef:AppName>
</jeef:GetMyProjectCharges>
</soapenv:Body>
</soapenv:Envelope>
要解析SOAP消息,使用某些wsdl到对象转换工具将是一个不错的选择。你已经发现了maven插件。要处理SOAP消息,请务必查看Apache Camel。
注意:名称空间由xmlns:whatever="http://some.url.to.a.model/"
定义。
答案 1 :(得分:1)
您有两种方法可以执行肥皂请求。
解决方案1
如果您使用netbeans作为代码IDE,您必须创建一个项目,右键单击一个包并选择New&gt;&gt; Web服务客户端。插入soap端点的url,然后单击“确定”。如果您在ide netbeans中安装了jax-ws / Metro扩展,则将生成所有必需的类以编程方式调用服务。 (问我是否有麻烦)
解决方案2
你可以使用简单的javax.xml
来实现一个soap请求private SOAPMessage invoke(QName serviceName, QName portName,
String soapActionUri) throws Exception {
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);
Dispatch dispatch = service.createDispatch(portName,
SOAPMessage.class, Service.Mode.MESSAGE);
dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, new Boolean(true));
dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, soapActionUri);
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
Source source = new DOMSource(getQueryString());
soapPart.setContent(source);
message.saveChanges();
System.out.println(message.getSOAPBody().getFirstChild().getTextContent());
SOAPMessage response = (SOAPMessage) dispatch.invoke(message);
return response;
}
private Node getQueryString() throws SAXException, IOException, ParserConfigurationException {
StringBuilder builder = new StringBuilder();
builder.append("<soapenv:Envelope");
// create your body
builder.append("</soapenv:Body>");
builder.append("</soapenv:Envelope>");
DocumentBuilderFactory docfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docbuilder = docfactory.newDocumentBuilder();
Document stringDocument = docbuilder.parse(new InputSource(new StringReader(builder.toString())));
return stringDocument;
}
并致电服务
String targetNameSpace = "your target namespace";
QName serviceName = new QName(targetNameSpace, "your service name");
QName portName = new QName(targetNameSpace, "Your port name");
String SOAPAction = "your soap action";
SOAPMessage response = invoke(serviceName, portName, SOAPAction);
if (response.getSOAPBody().hasFault()) {
System.out.println(response.getSOAPBody().getFault());
}
P.S。请原谅我的英语:(
答案 2 :(得分:0)
@Jeff你必须做这样的事情:
MyWebService service = new MyWebService(new Url(wsdlStringEndpoint));
Port port = service.getHttpsoap11port();
port.makerequest();
我曾打过一个通用电话,让你了解它的外观。如果您有一些问题再次询问(代码是示例代码)