How to send HTTP request GET/POST in Java
In this article, we will show you a few examples to make HTTP GET/POST requests via the following APIs
- Apache HttpClient 4.5.10
- OkHttp 4.2.2
- Java 11 HttpClient
- Java 1.1 HttpURLConnection (Not recommend)
1. Apache HttpClient
In the old days, this Apache HttpClient is the de facto standard to send an HTTP GET/POST request in Java.
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
package com.mkyong.http;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HttpClientExample {
// one instance, reuse
private final CloseableHttpClient httpClient = HttpClients.createDefault();
public static void main(String[] args) throws Exception {
HttpClientExample obj = new HttpClientExample();
try {
System.out.println("Testing 1 - Send Http GET request");
obj.sendGet();
System.out.println("Testing 2 - Send Http POST request");
obj.sendPost();
} finally {
obj.close();
}
}
private void close() throws IOException {
httpClient.close();
}
private void sendGet() throws Exception {
HttpGet request = new HttpGet("https://www.google.com/search?q=mkyong");
// add request headers
request.addHeader("custom-key", "mkyong");
request.addHeader(HttpHeaders.USER_AGENT, "Googlebot");
try (CloseableHttpResponse response = httpClient.execute(request)) {
// Get HttpResponse Status
System.out.println(response.getStatusLine().toString());
HttpEntity entity = response.getEntity();
Header headers = entity.getContentType();
System.out.println(headers);
if (entity != null) {
// return it as a String
String result = EntityUtils.toString(entity);
System.out.println(result);
}
}
}
private void sendPost() throws Exception {
HttpPost post = new HttpPost("https://httpbin.org/post");
// add request parameter, form parameters
List<NameValuePair> urlParameters = new ArrayList<>();
urlParameters.add(new BasicNameValuePair("username", "abc"));
urlParameters.add(new BasicNameValuePair("password", "123"));
urlParameters.add(new BasicNameValuePair("custom", "secret"));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
System.out.println(EntityUtils.toString(response.getEntity()));
}
}
}
Read more Apache HttpClient examples
2. OkHttp
This OkHttp is very popular on Android, and widely use in many web projects, the rising star.
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.2.2</version>
</dependency>
package com.mkyong.http;
import okhttp3.*;
import java.io.IOException;
public class OkHttpExample {
// one instance, reuse
private final OkHttpClient httpClient = new OkHttpClient();
public static void main(String[] args) throws Exception {
OkHttpExample obj = new OkHttpExample();
System.out.println("Testing 1 - Send Http GET request");
obj.sendGet();
System.out.println("Testing 2 - Send Http POST request");
obj.sendPost();
}
private void sendGet() throws Exception {
Request request = new Request.Builder()
.url("https://www.google.com/search?q=mkyong")
.addHeader("custom-key", "mkyong") // add request headers
.addHeader("User-Agent", "OkHttp Bot")
.build();
try (Response response = httpClient.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
// Get response body
System.out.println(response.body().string());
}
}
private void sendPost() throws Exception {
// form parameters
RequestBody formBody = new FormBody.Builder()
.add("username", "abc")
.add("password", "123")
.add("custom", "secret")
.build();
Request request = new Request.Builder()
.url("https://httpbin.org/post")
.addHeader("User-Agent", "OkHttp Bot")
.post(formBody)
.build();
try (Response response = httpClient.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
// Get response body
System.out.println(response.body().string());
}
}
}
Read more OkHttp examples
3. Java 11 HttpClient
In Java 11, a new HttpClient is introduced in package java.net.http.*
The sendAsync()
will return a CompletableFuture
, it makes concurrent requests much easier and flexible, no more external libraries to send an HTTP request!
package com.mkyong.http;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class Java11HttpClientExample {
// one instance, reuse
private final HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.build();
public static void main(String[] args) throws Exception {
Java11HttpClientExample obj = new Java11HttpClientExample();
System.out.println("Testing 1 - Send Http GET request");
obj.sendGet();
System.out.println("Testing 2 - Send Http POST request");
obj.sendPost();
}
private void sendGet() throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("https://httpbin.org/get"))
.setHeader("User-Agent", "Java 11 HttpClient Bot")
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// print status code
System.out.println(response.statusCode());
// print response body
System.out.println(response.body());
}
private void sendPost() throws Exception {
// form parameters
Map<Object, Object> data = new HashMap<>();
data.put("username", "abc");
data.put("password", "123");
data.put("custom", "secret");
data.put("ts", System.currentTimeMillis());
HttpRequest request = HttpRequest.newBuilder()
.POST(buildFormDataFromMap(data))
.uri(URI.create("https://httpbin.org/post"))
.setHeader("User-Agent", "Java 11 HttpClient Bot") // add request header
.header("Content-Type", "application/x-www-form-urlencoded")
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// print status code
System.out.println(response.statusCode());
// print response body
System.out.println(response.body());
}
private static HttpRequest.BodyPublisher buildFormDataFromMap(Map<Object, Object> data) {
var builder = new StringBuilder();
for (Map.Entry<Object, Object> entry : data.entrySet()) {
if (builder.length() > 0) {
builder.append("&");
}
builder.append(URLEncoder.encode(entry.getKey().toString(), StandardCharsets.UTF_8));
builder.append("=");
builder.append(URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8));
}
System.out.println(builder.toString());
return HttpRequest.BodyPublishers.ofString(builder.toString());
}
}
Read more Java 11 HttpClient examples
4. HttpURLConnection
This HttpURLConnection
class is available since Java 1.1, uses this if you dare 🙂 Generally, it’s NOT recommend to use this class, because the codebase is very old and outdated, it may not supports the new HTTP/2 standard, in fact, it’s really difficult to configure and use this class.
The below example is just for self reference, NOT recommend to use this class!
package com.mkyong.http;
import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
public static void main(String[] args) throws Exception {
HttpURLConnectionExample obj = new HttpURLConnectionExample();
System.out.println("Testing 1 - Send Http GET request");
obj.sendGet();
System.out.println("Testing 2 - Send Http POST request");
obj.sendPost();
}
private void sendGet() throws Exception {
String url = "https://www.google.com/search?q=mkyong";
HttpURLConnection httpClient =
(HttpURLConnection) new URL(url).openConnection();
// optional default is GET
httpClient.setRequestMethod("GET");
//add request header
httpClient.setRequestProperty("User-Agent", "Mozilla/5.0");
int responseCode = httpClient.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
try (BufferedReader in = new BufferedReader(
new InputStreamReader(httpClient.getInputStream()))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
//print result
System.out.println(response.toString());
}
}
private void sendPost() throws Exception {
// url is missing?
//String url = "https://selfsolve.apple.com/wcResults.do";
String url = "https://httpbin.org/post";
HttpsURLConnection httpClient = (HttpsURLConnection) new URL(url).openConnection();
//add reuqest header
httpClient.setRequestMethod("POST");
httpClient.setRequestProperty("User-Agent", "Mozilla/5.0");
httpClient.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345";
// Send post request
httpClient.setDoOutput(true);
try (DataOutputStream wr = new DataOutputStream(httpClient.getOutputStream())) {
wr.writeBytes(urlParameters);
wr.flush();
}
int responseCode = httpClient.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + urlParameters);
System.out.println("Response Code : " + responseCode);
try (BufferedReader in = new BufferedReader(
new InputStreamReader(httpClient.getInputStream()))) {
String line;
StringBuilder response = new StringBuilder();
while ((line = in.readLine()) != null) {
response.append(line);
}
//print result
System.out.println(response.toString());
}
}
}
Hi ,
After implementation i got below security related bug.
The call to HttpHost() (in my class on line 113 )uses an unencrypted protocol instead of an encrypted protocol to communicate with the server.
code:
private HttpHost getHttpProxy(String proxyHost,int proxyPort) {
return new HttpHost(proxyHost, proxyPort);
}
so how can i encrypt it?
I just copied the post method u’ve created and wanted to use it somewhere the same way as you did. It is just like your class but without the get() thing
when I run it on one site of mine i get:
java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection
at tests.web.POSTRequestTest.sendPost(POSTRequestTest.java:32)
at tests.web.POSTRequestTest.main(POSTRequestTest.java:18)
Article is updated, if possible, do not use
HttpURLConnection
, try Apache HttpClient or OkHttpyou have change the HttpsURLConnection to HttpURLConnection
Maybe consider using a StringBuilder instead of the StringBuffer?
Thanks, article is updated.
very helpfull Thanks !!
could you also tell how to sen request body for a port call
Do you means POST? Article is updated with more examples.
Thank for Sharing this post with us. Very Helpfull and usefull Information. Hope you keep it up in future also by providing informative post.This Post is very much handy.Best of Luck & Cheers.
Thank You
how to post a JSON data to server(tomcat7) using POSTmethod
Try this
https://www.mkyong.com/java/apache-httpclient-examples/
replace the next lines
List urlParameters = new ArrayList();
urlParameters.add(new BasicNameValuePair(“sn”, “C02G8416DRJM”));
urlParameters.add(new BasicNameValuePair(“cn”, “”));
urlParameters.add(new BasicNameValuePair(“locale”, “”));
urlParameters.add(new BasicNameValuePair(“caller”, “”));
urlParameters.add(new BasicNameValuePair(“num”, “12345”));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
with
post.setEntity(new StringEntity(“{“sn”:”C02G8416DRJM”}”,ContentType.create(“application/json”)));
Thank you for another great example. Can I ask you which JAR file the package java.net.http.* is in.
thank you so mutch
I couldn’t keep count of how many times your site has helped me.
You have my thanks sir !
Welcome.
I was wondering if I would need to send post requests to fill in a login form? I am not sure how I would do this using HttpClient and HTML 2.
Thanks mkyong for this tutorial, very informative and helpful.
I tried with Java versions 11, 12, 13 in Intellij, but java.net.http.HttpClient is not detected. Automatically sun.net.http.HttpClient is getting imported.
Cant we send request to a URL using sun.net.http.HttpClinet ?
My requirement is to read the data placed in a CSV file using URL.
I found this article useful.
I copy paste the above program in my eclipse getting , Exception in thread “main” java.net.UnknownHostException: http://www.google.com error , please let me know how to resolve this error
In 1. Apache HttpClient
if (entity != null) { …
is always true
getting 404 response
Sending ‘GET’ request to URL : http://www.google.com/search?q=mkyong
Response Code : 404
Exception in thread “main” java.io.FileNotFoundException: http://www.google.com/search?q=mkyong
404!? Which example you are referring?
hi, my url has some authentication so how can I pass credentials to the url
Try the authentication example.
https://www.mkyong.com/java/apache-httpclient-examples/
Hi,
I am trying to display the output from a simple while loop to angular front-end. Could you please help me in this regard?
Mkyoung you are the best java developer who can really teach other simple ! thank you men
Thanks man. Helped a lot
Thank you SO much!!
Thank you so much!
Simple and clear.
Good luck to you!
hi
i am getting java.net.ConnectException: Connection refused: connect exception
simple and clear, nice job…
how to run this aplication on terminal ubuntu?
Thanks your blog is awesome …
Hi, i am getting this exception when i try to open connection
Info: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
I can not understand why open this connection requires a certificate. This is related with the agent used (mozilla)?
If you are using https instead of http you will get this type of validation error
nice website
how about 3. Using Java Socket?
Hi,
I have a java standalone server which listen the request and then I open a socket connection. My requirement is, how can I know weather java client is using http or https protocol in my server programe.