简体   繁体   中英

From WDSL to java

I've been tasked with querying a soap client in java and i'm a bit confused as how to move forward.

The first thing i did was use the Wizdler chrome plugin to prototype my SOAP request. The soap "envelop" must be of this format I believe for it to work.

<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>

Next I've gone through some various tutorial as how to build a soap envelop in java but i keep getting into a strange situation where i'm getting <SOAP-ENV: prefixes on everything and when i take the generated envelop and try to paste it into the chrome plugin it doesn't work.

So I'm wondering where I go from here? I realize soap is a pretty heavy protocol and so maybe that is what is confusing me but what I'm looking to do (for now) is:

1) Generate a soap request in java that matches the format above, and print out the results.

I understand i "might" have the option of Maven or some program to generate some class files for me from the WDSL but I'm not exactly sure what i do with that either. Thanks!

Any help would be appreciated.

I am not sure if I got the point. Anyway I think you need to have the correct namespace for your soap messages. A blank SOAP message would look like this:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>

   </soapenv:Body>
</soapenv:Envelope>

So in your case I think this should work:

<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>

But normally you use a namespace in the payload as well (which means GetMyProjectCharges would be something like jeef:GetMyProjectCharges ).

Watch the 2nd namespace in the root tag

<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>

To parse the SOAP messages it would be a good choice to use some wsdl to objects conversion tool. There are maven plugins for this as you already found out. To process the SOAP messages it would be worth to take a look at Apache Camel .

Note: namespaces are defined by xmlns:whatever="http://some.url.to.a.model/" .

You have two way to do a soap request.

Solution 1

If you use netbeans as code IDE, you have to create a project, right click on a package and choose New >> Web Service Client. Insert the url of the soap endpoint and click ok. If you have jax-ws/Metro extension installed in your ide netbeans will generate all necessary classes to invoke the service programmatically. (ask me if you have troubles)

Solution 2

you could realize a soap request using simply javax.xml

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;
}

and to call the service use

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());
}

PS forgive me for my english :(

@Jeff you have to do something like this :

MyWebService service = new MyWebService(new Url(wsdlStringEndpoint));
Port port = service.getHttpsoap11port();
port.makerequest();

I've wroted a genericall call to make you understand how it should look. If you have some problems ask again (the code is a sample code)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM