Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending HTTP POST Request In Java

Tags:

java

http

post

lets assume this URL...

http://www.example.com/page.php?id=10             

(Here id needs to be sent in a POST request)

I want to send the id = 10 to the server's page.php, which accepts it in a POST method.

How can i do this from within Java?

I tried this :

URL aaa = new URL("http://www.example.com/page.php"); URLConnection ccc = aaa.openConnection(); 

But I still can't figure out how to send it via POST

like image 739
Jazz Avatar asked Jul 24 '10 10:07

Jazz


People also ask

What is HTTP POST method in Java?

What is POST method? POST is a method that is supported by HTTP and depicts that a web server accepts the data included in the body of the message. It is often used by World Wide Web to send user generated data to the web server or when you upload file. Let's create Java programs to see how to use GET and POST request.

How do you write a POST method in Java?

Create URL object from the GET/POST URL String. Set the request method in HttpURLConnection instance, default value is GET. Call setRequestProperty() method on HttpURLConnection instance to set request header values, such as “User-Agent” and “Accept-Language” etc.


2 Answers

Updated Answer:

Since some of the classes, in the original answer, are deprecated in the newer version of Apache HTTP Components, I'm posting this update.

By the way, you can access the full documentation for more examples here.

HttpClient httpclient = HttpClients.createDefault(); HttpPost httppost = new HttpPost("http://www.a-domain.com/foo/");  // Request parameters and other properties. List<NameValuePair> params = new ArrayList<NameValuePair>(2); params.add(new BasicNameValuePair("param-1", "12345")); params.add(new BasicNameValuePair("param-2", "Hello!")); httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));  //Execute and get the response. HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity();  if (entity != null) {     try (InputStream instream = entity.getContent()) {         // do something useful     } } 

Original Answer:

I recommend to use Apache HttpClient. its faster and easier to implement.

HttpPost post = new HttpPost("http://jakarata.apache.org/"); NameValuePair[] data = {     new NameValuePair("user", "joe"),     new NameValuePair("password", "bloggs") }; post.setRequestBody(data); // execute method and handle any error responses. ... InputStream in = post.getResponseBodyAsStream(); // handle response. 

for more information check this url: http://hc.apache.org/

like image 116
mhshams Avatar answered Sep 28 '22 16:09

mhshams


Sending a POST request is easy in vanilla Java. Starting with a URL, we need t convert it to a URLConnection using url.openConnection();. After that, we need to cast it to a HttpURLConnection, so we can access its setRequestMethod() method to set our method. We finally say that we are going to send data over the connection.

URL url = new URL("https://www.example.com/login"); URLConnection con = url.openConnection(); HttpURLConnection http = (HttpURLConnection)con; http.setRequestMethod("POST"); // PUT is another valid option http.setDoOutput(true); 

We then need to state what we are going to send:

Sending a simple form

A normal POST coming from a http form has a well defined format. We need to convert our input to this format:

Map<String,String> arguments = new HashMap<>(); arguments.put("username", "root"); arguments.put("password", "sjh76HSn!"); // This is a fake password obviously StringJoiner sj = new StringJoiner("&"); for(Map.Entry<String,String> entry : arguments.entrySet())     sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "="           + URLEncoder.encode(entry.getValue(), "UTF-8")); byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8); int length = out.length; 

We can then attach our form contents to the http request with proper headers and send it.

http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); http.connect(); try(OutputStream os = http.getOutputStream()) {     os.write(out); } // Do something with http.getInputStream() 

Sending JSON

We can also send json using java, this is also easy:

byte[] out = "{\"username\":\"root\",\"password\":\"password\"}" .getBytes(StandardCharsets.UTF_8); int length = out.length;  http.setFixedLengthStreamingMode(length); http.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); http.connect(); try(OutputStream os = http.getOutputStream()) {     os.write(out); } // Do something with http.getInputStream() 

Remember that different servers accept different content-types for json, see this question.


Sending files with java post

Sending files can be considered more challenging to handle as the format is more complex. We are also going to add support for sending the files as a string, since we don't want to buffer the file fully into the memory.

For this, we define some helper methods:

private void sendFile(OutputStream out, String name, InputStream in, String fileName) {     String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8")               + "\"; filename=\"" + URLEncoder.encode(filename,"UTF-8") + "\"\r\n\r\n";     out.write(o.getBytes(StandardCharsets.UTF_8));     byte[] buffer = new byte[2048];     for (int n = 0; n >= 0; n = in.read(buffer))         out.write(buffer, 0, n);     out.write("\r\n".getBytes(StandardCharsets.UTF_8)); }  private void sendField(OutputStream out, String name, String field) {     String o = "Content-Disposition: form-data; name=\""               + URLEncoder.encode(name,"UTF-8") + "\"\r\n\r\n";     out.write(o.getBytes(StandardCharsets.UTF_8));     out.write(URLEncoder.encode(field,"UTF-8").getBytes(StandardCharsets.UTF_8));     out.write("\r\n".getBytes(StandardCharsets.UTF_8)); } 

We can then use these methods to create a multipart post request as follows:

String boundary = UUID.randomUUID().toString(); byte[] boundaryBytes =             ("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8); byte[] finishBoundaryBytes =             ("--" + boundary + "--").getBytes(StandardCharsets.UTF_8); http.setRequestProperty("Content-Type",             "multipart/form-data; charset=UTF-8; boundary=" + boundary);  // Enable streaming mode with default settings http.setChunkedStreamingMode(0);   // Send our fields: try(OutputStream out = http.getOutputStream()) {     // Send our header (thx Algoman)     out.write(boundaryBytes);      // Send our first field     sendField(out, "username", "root");      // Send a seperator     out.write(boundaryBytes);      // Send our second field     sendField(out, "password", "toor");      // Send another seperator     out.write(boundaryBytes);      // Send our file     try(InputStream file = new FileInputStream("test.txt")) {         sendFile(out, "identification", file, "text.txt");     }      // Finish the request     out.write(finishBoundaryBytes); }   // Do something with http.getInputStream() 
like image 20
Ferrybig Avatar answered Sep 28 '22 17:09

Ferrybig