从WDSL到java

时间:2015-08-19 14:30:31

标签: java web-services soap

我的任务是查询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为我生成一些类文件,但我不确定我是怎么做的。谢谢!

任何帮助都将不胜感激。

3 个答案:

答案 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();

我曾打过一个通用电话,让你了解它的外观。如果您有一些问题再次询问(代码是示例代码)