user677275
user677275

Reputation: 77

Calling webservice from java by posting the xml

I hope someone can help me. I'm a bit of a noob to Java. But I have a question regarding calling a web service from Java. The question is actually simple but one way works the other does not?

If I call a web service from Java like this, it works:

try {
    String parameters = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
        "<soap:Body>"+
        " <HelloWorld xmlns=\"http://np-challenger\" />"+
        "</soap:Body>"+
        "</soap:Envelope>";
    //out.println(parameters);
    java.net.URL url = new java.net.URL("http://localhost:50217/WebSite3/Service.asmx");
    java.net.HttpURLConnection connjava = (java.net.HttpURLConnection)url.openConnection();
    connjava.setRequestMethod("GET");
    connjava.setRequestProperty("Content-Length", "" + Integer.toString(parameters.getBytes().length));
    connjava.setRequestProperty("Content-Language", "en-US"); 
    connjava.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
    connjava.setRequestProperty("SOAPAction", "http://np-challenger/HelloWorld");
    connjava.setDoInput(true); 
    connjava.setDoOutput(true); 
    connjava.setUseCaches(false); 
    connjava.setAllowUserInteraction(true);
    java.io.DataOutputStream printout = new java.io.DataOutputStream (connjava.getOutputStream());
    printout.writeBytes(parameters);
    printout.flush();
    printout.close();
    java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(connjava.getInputStream()));
    String line;            
    while ((line = in.readLine()) != null) {
        System.out.println(line);
        /*pagecontent += stuff;*/
    }
    in.close();
} catch (Exception e) {
    System.out.println("Error: "+ e);
}

However, if I try to do it like this, I keep getting a bad request. I'm just about ready to pull my hair out.

try {
    String xmlData = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
        "<soap:Body>"+
        " <HelloWorld xmlns=\"http://np-challenger\" />"+
        "</soap:Body>"+
        "</soap:Envelope>";

    //create socket
    String hostname = "localhost";
    int port = 50217;
    InetAddress addr = InetAddress.getByName(hostname);
    Socket sock = new Socket(addr,port);

    FileWriter fstream = new FileWriter("out.txt");

    // Send header
    String path = "/WebSite3/Service.asmx";
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF8"));
    bw.write("POST " + path + " HTTP/1.1\r\n");
    bw.write("Host: localhost\r\n");
    bw.write("Content-Type: text/xml; charset=\"utf-8\"\r\n");
    bw.write("Content-Length: " + xmlData.length() + "\r\n");
    bw.write("SOAPAction: \"http://np-challenger/HelloWorld\"");

    bw.write("\r\n");

    // Send POST data string
    bw.write(xmlData);
    bw.flush();

    // Process the response from the Web Services
    BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    bw.close();
    br.close();
} catch(Exception e) {
    System.err.println(e.getMessage());    
    e.printStackTrace(System.err);
}

Upvotes: 1

Views: 10202

Answers (2)

dinesh028
dinesh028

Reputation: 2187

It's actually difference in data that is going to server. Monitor the data that you are actually posting using TCP Monitor. and compare the data i.e. mime header, request xml etc.

You will find the mistake. As far as I can see, first method is using GET method while second method is using POST method. I do not say that this is error just monitor actual data that is going to server and you will automatically get your problem resolved.

Upvotes: 1

Eli Acherkan
Eli Acherkan

Reputation: 6411

I'm a bit suspicious whether the way you calculate the content length is correct, but more importantly:

Use a testing tool.

You can use a testing tool to compare between good and bad requests. One of such tools is soapUI, it's very convenient in showing you the exact contents of the requests and responses.

Create a new project in soapUI, based on the WSDL of your web service. Make sure to mark the checkboxes "Create sample requests for all operations" and "Create a Web Service Simulation of the imported WSDL". This way, soapUI will be able to act both as a client for your actual .NET web service, and as a server to which your Java client will connect.

Make sure that when soapUI connects acts as a client and connects to your web service, the request is processed correctly. Then run it as a server, send a request from Java, and compare it to the request that was processed successfully.

I chose to emphasize the role of a testing tool instead of addressing the specific problems in your code, because I believe that the ability to analyze the contents of your requests and responses will prove to be valuable time after time.

Use a WS framework.

Working with web services on such a low level requires a lot of unnecessary work from you. There are several frameworks and tools in Java that allow you to work on a higher abstraction level, eliminating the need to handle sockets and HTTP headers yourself. Take a look at the JAX-WS standard. This tutorial shows how to create a client for an existing web service. You'll notice that it's much simpler than your code sample.

Other popular WS frameworks in Java are Apache Axis2 and Apache CXF.

Upvotes: 2

Related Questions