11

How do I post an XML request to a URL using HTTP POST and retrieve the response?

Update Sorry, my question was not clear I guess. I want to know how to post an XML request to an URL using either HttpClient or URLConnection and get the response as a POST parameter and display it in a webpage.

4
  • using what? httpclient, URLConnection? To what - a web-page, a webservice? Your question is unclear. Commented Apr 29, 2010 at 8:39
  • sorry.. either httpclient or URLConnection.. i need to display the response in a web page.. Commented Apr 29, 2010 at 8:43
  • update the question with these details. and give some more - what is the target page and how is it expecting the xml. As a typical post parameter? Commented Apr 29, 2010 at 8:46
  • 17
    C'mon Java folk, don't be too elitist! If you have an endpoint that accept HTTP POST, is an http post. The question is clear. Commented Apr 29, 2010 at 12:48

4 Answers 4

16

Here's an example how to do it with java.net.URLConnection:

String url = "http://example.com";
String charset = "UTF-8";
String param1 = URLEncoder.encode("param1", charset);
String param2 = URLEncoder.encode("param2", charset);
String query = String.format("param1=%s&param2=%s", param1, param2);

URLConnection urlConnection = new URL(url).openConnection();
urlConnection.setUseCaches(false);
urlConnection.setDoOutput(true); // Triggers POST.
urlConnection.setRequestProperty("accept-charset", charset);
urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded");

OutputStreamWriter writer = null;
try {
    writer = new OutputStreamWriter(urlConnection.getOutputStream(), charset);
    writer.write(query); // Write POST query string (if any needed).
} finally {
    if (writer != null) try { writer.close(); } catch (IOException logOrIgnore) {}
}

InputStream result = urlConnection.getInputStream();
// Now do your thing with the result.
// Write it into a String and put as request attribute
// or maybe to OutputStream of response as being a Servlet behind `jsp:include`.
Sign up to request clarification or add additional context in comments.

2 Comments

what if I hope to get it from request.getInputStream, rather than get it from xml, what should I do in the clent?
My xml is getting encoded to %3c . Can you please tell me how to prevent this.
6

This example post an xml file, it depends on Jakarta HttpClient API (jakarta.apache.org)

import java.io.File;
import java.io.FileInputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;

/**
 * This is a sample application that demonstrates
 * how to use the Jakarta HttpClient API.
 *
 * This application sends an XML document
 * to a remote web server using HTTP POST
 *
 * @author Sean C. Sullivan
 * @author Ortwin Glück
 * @author Oleg Kalnichevski
 */
public class PostXML {

    /**
     *
     * Usage:
     * java PostXML http://mywebserver:80/ c:\foo.xml
     *
     * @param args command line arguments
     * Argument 0 is a URL to a web server
     * Argument 1 is a local filename
     *
     */
    public static void main(String[] args) throws Exception {

        if (args.length != 2) {
            System.out.println(
                "Usage: java -classpath <classpath> [-Dorg.apache.commons."+
                "logging.simplelog.defaultlog=<loglevel>]" +
                " PostXML <url> <filename>]");

            System.out.println("<classpath> - must contain the "+
                "commons-httpclient.jar and commons-logging.jar");

            System.out.println("<loglevel> - one of error, "+
                    "warn, info, debug, trace");

            System.out.println("<url> - the URL to post the file to");
            System.out.println("<filename> - file to post to the URL");
            System.out.println();
            System.exit(1);
        }

        // Get target URL
        String strURL = args[0];

        // Get file to be posted
        String strXMLFilename = args[1];
        File input = new File(strXMLFilename);

        // Prepare HTTP post
        PostMethod post = new PostMethod(strURL);

        // Request content will be retrieved directly
        // from the input stream
        // Per default, the request content needs to be buffered
        // in order to determine its length.
        // Request body buffering can be avoided when
        // content length is explicitly specified
        post.setRequestEntity(new InputStreamRequestEntity(
                new FileInputStream(input), input.length()));

        // Specify content type and encoding
        // If content encoding is not explicitly specified
        // ISO-8859-1 is assumed
        post.setRequestHeader(
                "Content-type", "text/xml; charset=ISO-8859-1");

        // Get HTTP client
        HttpClient httpclient = new HttpClient();

        // Execute request
        try {

            int result = httpclient.executeMethod(post);

            // Display status code
            System.out.println("Response status code: " + result);

            // Display response
            System.out.println("Response body: ");
            System.out.println(post.getResponseBodyAsString());

        } finally {
            // Release current connection to the connection pool 
            // once you are done
            post.releaseConnection();
        }
    }
}

Comments

6

Use InputStreamEntity. I used httpclient 4.2.1.

For example:

HttpPost httppost = new HttpPost(url);
InputStream inputStream=new ByteArrayInputStream(xmlString.getBytes());//init your own inputstream
InputStreamEntity inputStreamEntity=new InputStreamEntity(inputStream,xmlString.getBytes());
httppost.setEntity(inputStreamEntity);

Comments

3

Warning this code is 5+ years old. I did some modfying for this post and never tested it. Hopefully it helps.

Post XML (data) to a server and downlod the resp:

 public int uploadToServer(String data) throws Exception {
      OutputStream os;
      URL url = new URL("someUrl");

      HttpURLConnection httpConn= (HttpURLConnection) url.openConnection();
      os = httpConn.getOutputStream();

      BufferedWriter osw = new BufferedWriter(new OutputStreamWriter(os));

      osw.write(data);
      osw.flush();
      osw.close();

      return httpConn.getResponseCode();
 }

 public String downloadFromServer() throws MalformedURLException, IOException {
      String returnString = null;
      StringBuffer sb = null;
      BufferedInputStream in;

      //set up httpConn code not included same as previous

      in = new BufferedInputStream(httpConn.getInputStream());            
      int x = 0;
      sb = new StringBuffer();

      while ((x = in.read()) != -1) {
           sb.append((char) x);
      }

      in.close();
      in = null;

      if (httpConn != null) {
          httpConn.disconnect();
      }

      return sb.toString();  
  }

Somewhere else.....

int respCode = uploadToServer(someXmlData);
if (respCode == 200) {       
    String respData = downloadFromServer();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.