soap ui generated code

19,643

The problem with your code is lack of Authentication element in the SOAP header. Take a look at the WSDL, it should always be there:

<wsdl:operation name="CheckIfAuthorized">
    <soap:operation soapAction="http://www.cmicdataservices.com/CheckIfAuthorized" style="document"/>
    <wsdl:input>
        <soap:body use="literal"/>
        <soap:header message="tns:CheckIfAuthorizedAuthentication" part="Authentication" use="literal"/>
    </wsdl:input>
    <wsdl:output>
        <soap:body use="literal"/>
    </wsdl:output>
</wsdl:operation>

You server fails with exception because of incorrect XML when there is no Authentication element in the CheckIfAuthorized request. Here is sample client in Python to demonstrate the idea of solving the problem, I think it's not a problem for you to convert it to Java.

from suds.client import Client

client = Client("http://www.cmicdataservices.com/datacenter/service.asmx?wsdl")
auth = client.factory.create('Authentication')
auth.UserName = "username"
auth.Password = "password"
client.set_options(soapheaders=auth)
client.service.CheckIfAuthorized()
Share:
19,643
grantk
Author by

grantk

Updated on July 05, 2022

Comments

  • grantk
    grantk almost 2 years

    I have a webservice I am trying to build a client for.

    I have the following wsdl:

    http://www.cmicdataservices.com/datacenter/service.asmx?wsdl
    

    It requires authentication. Looking at the WSDL description I see no method that takes an authentication object, nor username and passwords as arguments. Using Netbeans I have generated jax-ws sources for the WSDL. I however can not figure out what to do after that.

    Using soapui I can connect to the webservice and run all the methods. But once again, I want to build this into a client that can be run without my interaction.

    My problem comes in figuring out how to use this generated code, which it appears netbeans.tv had a video(netbeans soapui plugin video 2) which has since been lost. Does anyone know of any tutorials or know of any examples of how I can use this generated code to access the webservice?

    so I have a method CheckifAuthorized()

    Running in soapui I get the following xml

    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:cmic="http://www.cmicdataservices.com/">
       <soap:Header>
          <cmic:Authentication>
             <!--Optional:-->
             <cmic:UserName>username</cmic:UserName>
             <!--Optional:-->
             <cmic:Password>password</cmic:Password>
          </cmic:Authentication>
       </soap:Header>
       <soap:Body>
          <cmic:CheckIfAuthorized/>
       </soap:Body>
    </soap:Envelope>
    

    I can then run that request in soap ui and get back the response that authentication was a success.

    With the jax-ws code generated with netbeans and with soapui as well I have the following:

    package javaapplication7;
    
    /**
     *
     * @author grant
     */
    public class Main {
    
        public static void main(String[] args) {
    
            Boolean result = checkIfAuthorized();
            System.out.println("The result is: " + result);
        }
    
        private static boolean checkIfAuthorized() {
            javaapplication7.CMICDatacenterService service = new javaapplication7.CMICDatacenterService();
            javaapplication7.CMICDatacenterServiceSoap port = service.getCMICDatacenterServiceSoap();
            return port.checkIfAuthorized();
        }
    }
    

    This will fail with the following error

    run:
    Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Server was unable to process request. ---> Object reference not set to an instance of an object.
            at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
            at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
            at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
            at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
            at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
            at $Proxy30.checkIfAuthorized(Unknown Source)
            at javaapplication7.Main.checkIfAuthorized(Main.java:24)
            at javaapplication7.Main.main(Main.java:17)
    Java Result: 1
    

    This is the same problem I ran into when trying to use python for the service. I have since chosen to go with Java as I feel I may have quicker turnaround on parsing the xml and creating objects as I already have the entities for this created.

    Thank you.

    Grant

    I did not want to answer this because I would still like to figure out what I can do here, but I did just end up writing the request by hand with the following. Now I can just convert this into an xml object and go about my way, but I imagine soapui makes all of this much easier. What I really do not understand is how to use soapui to build this request and incorporate it into my project:

    public class Main {
    
        public final static String DEFAULT_SERVER =
                "http://www.cmicdataservices.com/datacenter/service.asmx";
        public final static String SOAP_ACTION =
                "http://www.cmicdataservices.com/CheckIfAuthorized";
    
         public static void main(String[] args) {
             String server = DEFAULT_SERVER;
             String UserName = "Username";
             String Password="Password";
    
    
         try{
                 URL url = new URL(server);
                 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
                connection.setRequestProperty("Host", "www.cmicdataservices.com");
                OutputStream out = connection.getOutputStream();
                Writer wout = new OutputStreamWriter(out);
                // Uncomment the following and comment out the previous two lines to see your xml
                //BufferedWriter wout = new BufferedWriter(new FileWriter("/tmp/testXML.xml"));
    
                //Start writing soap request - Envelope
                wout.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
                wout.write("<soap12:Envelope ");
                wout.write("xmlns:xsi=");
                wout.write("'http://www.w3.org/2001/XMLSchema-instance' ");
                wout.write("xmlns:xsd=");
                wout.write("'http://www.w3.org/2001/XMLSchema' ");
                wout.write("xmlns:soap12=");
                wout.write("'http://www.w3.org/2003/05/soap-envelope'>\r\n");
    
                //Soap request header start
                wout.write("<soap12:Header>\r\n");
    
                //Start writing soap request - Authentication
                wout.write("<Authentication xmlns=");
                wout.write("'http://www.cmicdataservices.com/'>\r\n");
                wout.write("<UserName>" + UserName + "</UserName>\r\n");
                wout.write("<Password>" + Password + "</Password>\r\n");
                // End Authentication
                wout.write("</Authentication>\r\n");
    
                //End the header
                wout.write("</soap12:Header>\r\n");
    
                //Start writing the body
                wout.write("<soap12:Body>");
                wout.write("<GetCurrentDataVer1 xmlns=");
                wout.write("'http://www.cmicdataservices.com/' />\r\n");
                // End the Body
                wout.write("</soap12:Body>\r\n");
    
                // End the Envelope
                wout.write("</soap12:Envelope>\r\n");
    
                wout.flush();
                wout.close();
    
    
                //BufferedWriter fout = new BufferedWriter(new FileWriter("/tmp/testXMLResponse.xml"));
                InputStream in = connection.getInputStream();
                createFile(in, "/tmp/testXMLResponse.xml");
         }
         catch (IOException e) {
             System.err.println(e);
         }
         }
    
         public static void createFile(InputStream io, String fileName) throws IOException {
             FileOutputStream fout = new FileOutputStream(fileName);
             byte[] buf = new byte[256];
             int read = 0;
             while ((read = io.read(buf)) != -1){
                 fout.write(buf, 0, read);
             }
         }