title: Calling webservice from java by posting the xml
body: <p>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?</p>
  
  <p>If I call a web service from Java like this, it works:</p>
  
  <pre><code>try {
      String parameters = "&lt;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/\"&gt;"+
          "&lt;soap:Body&gt;"+
          " &lt;HelloWorld xmlns=\"http://np-challenger\" /&gt;"+
          "&lt;/soap:Body&gt;"+
          "&lt;/soap:Envelope&gt;";
      //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);
  }
  </code></pre>
  
  <p>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.</p>
  
  <pre><code>try {
      String xmlData = "&lt;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/\"&gt;"+
          "&lt;soap:Body&gt;"+
          " &lt;HelloWorld xmlns=\"http://np-challenger\" /&gt;"+
          "&lt;/soap:Body&gt;"+
          "&lt;/soap:Envelope&gt;";
  
      //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);
  }
  </code></pre>