Main Tutorials

How to send HTTP request GET/POST in Java

Java http requests

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.

pom.xml

	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.5.10</version>
	</dependency>
HttpClientExample.java

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()));
        }

    }

}

2. OkHttp

This OkHttp is very popular on Android, and widely use in many web projects, the rising star.

pom.xml

	<dependency>
		<groupId>com.squareup.okhttp3</groupId>
		<artifactId>okhttp</artifactId>
		<version>4.2.2</version>
	</dependency>
OkHttpExample.java

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());
        }

    }

}
Note
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!

Java11HttpClientExample.java

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());
    }

}

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!

HttpURLConnectionExample.java

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());

        }

    }

}

References

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
113 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Samir
6 years ago

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?

IchHabsDrauf
6 years ago

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)

sweli
4 years ago
Reply to  IchHabsDrauf

you have change the HttpsURLConnection to HttpURLConnection

Daniel
6 years ago

Maybe consider using a StringBuilder instead of the StringBuffer?

RahulS
6 years ago

very helpfull Thanks !!

Guest
6 years ago

could you also tell how to sen request body for a port call

Martin
6 years ago

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

ahemad
6 years ago

how to post a JSON data to server(tomcat7) using POSTmethod

leonskb4
6 years ago
Reply to  ahemad

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”)));

Mike Bleahen
1 year ago

Thank you for another great example. Can I ask you which JAR file the package java.net.http.* is in.

Amine
2 years ago

thank you so mutch

M Aamir Ali
3 years ago

I couldn’t keep count of how many times your site has helped me.
You have my thanks sir !

Landon
3 years ago

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.

Sumit Sharma
3 years ago

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.

Shambhuling
4 years ago

I found this article useful.

ashwink
4 years ago

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

Kristjan Kiolein
4 years ago

In 1. Apache HttpClient

if (entity != null) { …

is always true

Mohit
4 years ago

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

Goutham
4 years ago

hi, my url has some authentication so how can I pass credentials to the url

hdbf
4 years ago

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?

Abay
4 years ago

Mkyoung you are the best java developer who can really teach other simple ! thank you men

Kavinda Jayakody
4 years ago

Thanks man. Helped a lot

Dennis
5 years ago

Thank you SO much!!

George
5 years ago

Thank you so much!
Simple and clear.
Good luck to you!

Saranyadevi.M
5 years ago

hi

i am getting java.net.ConnectException: Connection refused: connect exception

wkstone
5 years ago

simple and clear, nice job…

pika
5 years ago

how to run this aplication on terminal ubuntu?

sanket jani
5 years ago

Thanks your blog is awesome …

Nicolas Caballero
6 years ago

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)?

sandeep
4 years ago

If you are using https instead of http you will get this type of validation error

kevin
6 years ago

nice website

Yanko
6 years ago

how about 3. Using Java Socket?

Sandeep Shukla
6 years ago

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.