Web service client given WSDL

user506518 picture user506518 · Nov 13, 2010 · Viewed 80.8k times · Source

I am trying to create a web service client in Java. I am not aware of how to do it. This is a URL for WSDL: https://testservices.gatewayedi.com/PayerList/payerlist.asmx?wsdl

This is the WSDL:

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="https://ws.gatewayedi.com/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="https://ws.gatewayedi.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="https://ws.gatewayedi.com/">
      <s:element name="Ping">
        <s:complexType />
      </s:element>
      <s:element name="PingResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="PingResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="AuthSOAPHeader" type="tns:AuthSOAPHeader" />
      <s:complexType name="AuthSOAPHeader">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="User" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
        </s:sequence>
        <s:anyAttribute />
      </s:complexType>
      <s:element name="GetXMLPayerList">
        <s:complexType />
      </s:element>
      <s:element name="GetXMLPayerListResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetXMLPayerListResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getDocLinks">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="pid" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getDocLinksResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="getDocLinksResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="PingSoapIn">
    <wsdl:part name="parameters" element="tns:Ping" />
  </wsdl:message>
  <wsdl:message name="PingSoapOut">
    <wsdl:part name="parameters" element="tns:PingResponse" />
  </wsdl:message>
  <wsdl:message name="PingAuthSOAPHeader">
    <wsdl:part name="AuthSOAPHeader" element="tns:AuthSOAPHeader" />
  </wsdl:message>
  <wsdl:message name="GetXMLPayerListSoapIn">
    <wsdl:part name="parameters" element="tns:GetXMLPayerList" />
  </wsdl:message>
  <wsdl:message name="GetXMLPayerListSoapOut">
    <wsdl:part name="parameters" element="tns:GetXMLPayerListResponse" />
  </wsdl:message>
  <wsdl:message name="GetXMLPayerListAuthSOAPHeader">
    <wsdl:part name="AuthSOAPHeader" element="tns:AuthSOAPHeader" />
  </wsdl:message>
  <wsdl:message name="getDocLinksSoapIn">
    <wsdl:part name="parameters" element="tns:getDocLinks" />
  </wsdl:message>
  <wsdl:message name="getDocLinksSoapOut">
    <wsdl:part name="parameters" element="tns:getDocLinksResponse" />
  </wsdl:message>
  <wsdl:message name="getDocLinksAuthSOAPHeader">
    <wsdl:part name="AuthSOAPHeader" element="tns:AuthSOAPHeader" />
  </wsdl:message>
  <wsdl:portType name="PayerListSoap">
    <wsdl:operation name="Ping">
      <wsdl:input message="tns:PingSoapIn" />
      <wsdl:output message="tns:PingSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="GetXMLPayerList">
      <wsdl:input message="tns:GetXMLPayerListSoapIn" />
      <wsdl:output message="tns:GetXMLPayerListSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="getDocLinks">
      <wsdl:input message="tns:getDocLinksSoapIn" />
      <wsdl:output message="tns:getDocLinksSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="PayerListSoap" type="tns:PayerListSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Ping">
      <soap:operation soapAction="https://ws.gatewayedi.com/Ping" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
        <soap:header message="tns:PingAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetXMLPayerList">
      <soap:operation soapAction="https://ws.gatewayedi.com/GetXMLPayerList" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
        <soap:header message="tns:GetXMLPayerListAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getDocLinks">
      <soap:operation soapAction="https://ws.gatewayedi.com/getDocLinks" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
        <soap:header message="tns:getDocLinksAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="PayerListSoap12" type="tns:PayerListSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="Ping">
      <soap12:operation soapAction="https://ws.gatewayedi.com/Ping" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
        <soap12:header message="tns:PingAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetXMLPayerList">
      <soap12:operation soapAction="https://ws.gatewayedi.com/GetXMLPayerList" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
        <soap12:header message="tns:GetXMLPayerListAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getDocLinks">
      <soap12:operation soapAction="https://ws.gatewayedi.com/getDocLinks" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
        <soap12:header message="tns:getDocLinksAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="PayerList">
    <wsdl:port name="PayerListSoap" binding="tns:PayerListSoap">
      <soap:address location="https://testservices.gatewayedi.com/PayerList/payerlist.asmx" />
    </wsdl:port>
    <wsdl:port name="PayerListSoap12" binding="tns:PayerListSoap12">
      <soap12:address location="https://testservices.gatewayedi.com/PayerList/payerlist.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

There are three methods in the service.

I am trying to call this method using SOAP.

The XML message format is:

POST /PayerList/payerlist.asmx HTTP/1.1 
Host: testservices.gatewayedi.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: <<insert message length here>> 
<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Header> <AuthSOAPHeader xmlns="https://ws.gatewayedi.com/"> <User><<insert user id here>>
</User> 
<Password><<insert user web password here>> </Password> 
</AuthSOAPHeader> 
</soap12:Header> <soap12:Body> <Ping xmlns="https://ws.gatewayedi.com/" />
 </soap12:Body> 
</soap12:Envelope> 

Anyone who knows the solution please let me know. Any help is really appreciable.

Answer

Pascal Thivent picture Pascal Thivent · Nov 13, 2010

As hinted in a comment to Jon's answer, my recommendation would be to use a JAX-WS implementation like JAX-WS RI (which is included in Java 6) or Apache CXF.

I'll use JAX-WS RI to illustrate my answer as it's available out of the box, on the command line (to explain the steps) but I'd recommend using an IDE with good JAX-WS support e.g. NetBeans (see the resources at the end of the answer).

1. Generate JAX-WS artifacts from the WSDL

First run wsimport to generate JAX-WS artifacts (to put it simply, the classes you'll need to invoke the web service):

wsimport -d generated -extension -keep -p com.gatewayedi.ws -XadditionalHeaders https://testservices.gatewayedi.com/PayerList/payerlist.asmx?wsdl 

About the options:

Sorry if some of the vocabulary is cryptic but, well, welcome to SOAP web services :)

2. Implement a client

Here is a simple client showing how to invoke one of the available operations using the generated classes:

import com.gatewayedi.ws.AuthSOAPHeader;
import com.gatewayedi.ws.PayerList;
import com.gatewayedi.ws.PayerListSoap;

public class Main {

    public static void main(String[] args) {
        new Main().callWebService();
    }

    private void callWebService() {
        PayerList service = new PayerList();
        PayerListSoap port = service.getPayerListSoap();

        AuthSOAPHeader authSOAPHeader = new AuthSOAPHeader();
        authSOAPHeader.setUser("test");
        authSOAPHeader.setPassword("test");

        String payerList = port.ping(authSOAPHeader);

        System.out.println(payerList);
    }

}

Below, the generated request:

<?xml version="1.0"  standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<AuthSOAPHeader xmlns="https://ws.gatewayedi.com/">
<User>test</User>
<Password>test</Password>
</AuthSOAPHeader>
</S:Header>
<S:Body>
<Ping xmlns="https://ws.gatewayedi.com/"/>
</S:Body>
</S:Envelope>

Don't know what credentials you're supposed to pass though.

Resources

Related questions