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 the Author

author image
mkyong
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

avatar
81 Comment threads
23 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
89 Comment authors
Kristjan KioleinmkyongMohitsandeepGoutham Recent comment authors
newest oldest most voted
IchHabsDrauf
Guest
IchHabsDrauf

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
Guest
sweli

you have change the HttpsURLConnection to HttpURLConnection

Guest
Guest
Guest

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

Daniel
Guest
Daniel

Maybe consider using a StringBuilder instead of the StringBuffer?

Samir
Guest
Samir

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?

ahemad
Guest
ahemad

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

leonskb4
Guest
leonskb4

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

RahulS
Guest
RahulS

very helpfull Thanks !!

Martin
Guest
Martin

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

Nicolas Caballero
Guest
Nicolas Caballero

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
Guest
sandeep

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

kevin
Guest
kevin

nice website

Yanko
Guest
Yanko

how about 3. Using Java Socket?

Sandeep Shukla
Guest
Sandeep Shukla

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.

Luc
Guest
Luc

What means this line of code?
String urlParameters = “sn=C02G8416DRJM&cn=&locale=&caller=&num=12345”;

David
Guest
David

Thank You for giving us idea about how to send HTTP request GET/POST in Java.
Thank You Very Much For Sharing Your Knowledge with US.Now a Day No Body Do what you did.We are really blessed with this types of informatic Posting. Hope you continue this in Future.Keep us updated with this this types of blogs.Best of Luck & Cheers.
Thanks David

Robert Lecomte
Guest
Robert Lecomte

very helpfull Thanks !!

John
Guest
John

Thank you very very much <3

Yonko
Guest
Yonko

I dont understand the method for the http connection example could someone please explain it using an example . you know one with an actual url and parameters and api call

Paul
Guest
Paul

Hi,
Thank you for these useful examples!

When I used the Java Post example, I’ve encountered some issues when sending content than contains non English characters.

Investigating it showed that the cause is the usage of DataOutputStream.writeBytes(). From this class documentation: “Each character in the string is written out, in sequence, by discarding its high eight bits.”

The solution is to use:
Writer out = new BufferedWriter(new OutputStreamWriter(con.getOutputStream()));
out.write(urlParameters);

Jesus David Sanchez Suarez
Guest
Jesus David Sanchez Suarez

Hi all
The example with HttpURLConnection does not work, I have been looking for a solution but I have not found my error is this:
java.net.ConnectException: Connection refused: connect…
The server is active, port 8000 is active, it is in a local environment

Nilupul Nuwan
Guest
Nilupul Nuwan

this perfectly working. but when i use java Swing i can’t pass the parameters to urlParameters from jTextField.

CODE:
String urlParameters = “NAME=”+jTextField_name.getText()+”&address=”+jTextField_add.getText();

OUTPUT:
Post parameters :NAME=&address=

also i assign “jTextField_name.getText()” to variable but output was same.

so can you solved this problem

Curtis Newton
Guest
Curtis Newton

“unable to find valid certification path to requested target”

Mike
Guest
Mike

This error is not a problem with the code sample given above but it means that the server that you are attempting to connect to is secured with a certificate. You will need to add that severs certificate to your local keystore.

Byron
Guest
Byron

Really Awesome! Thank you so much Really helped!

MMU UNI
Guest
MMU UNI

yeah thanks mkyong can already
for those cannot just change this line
HttpClientExample http = new HttpClientExample();

MMU UNI
Guest
MMU UNI

HI mkyong why i have this error ?
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Exception in thread “main” java.lang.RuntimeException: Uncompilable source code – cannot find symbol
symbol: class HttpURLConnectionExample
location: class lab1.Lab1
at lab1.Lab1.main(Lab1.java:27)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Curtis Newton
Guest
Curtis Newton

learn how to write java programs first maybe

Danio
Guest
Danio

Can you describe not how to send but how to recieve POST or GET request? I would like to recieve POST for example, but without using servlets. I would rather use JQuery and send POST to .jar file. Can it be done?

ironhide
Guest
ironhide

publishing the article is ok. how come the same work for you and not for others.

Dave
Guest
Dave

Does mkyong ever respond to questions or posts..?

Madhuri Kalshetty
Guest
Madhuri Kalshetty

HttpUrlConnection is synchronous or asynchronous

SVK PETO
Guest
SVK PETO

You have forgotten to write version of Apache HttpClient. Your code is @deprecated for version 4.5.1.

keshav
Guest
keshav

i am getting connection time out error………and javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException

keshav
Guest
keshav

provide the solution