Main Tutorials

RESTful Java client with java.net.URL

In this tutorial, we show you how to create a RESTful Java client with Java build-in HTTP client library. It’s simple to use and good enough to perform basic operations for REST service.

The RESTful services from last “Jackson + JAX-RS” article will be reused, and we will use “java.net.URL” and “java.net.HttpURLConnection” to create a simple Java client to send “GET” and “POST” request.

1. GET Request

Review last REST service, return “json” data back to client.


@Path("/json/product")
public class JSONService {

	@GET
	@Path("/get")
	@Produces("application/json")
	public Product getProductInJSON() {

		Product product = new Product();
		product.setName("iPad 3");
		product.setQty(999);
		
		return product; 

	}
	//...

Java client to send a “GET” request.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class NetClientGet {

	// http://localhost:8080/RESTfulExample/json/product/get
	public static void main(String[] args) {

	  try {

		URL url = new URL("http://localhost:8080/RESTfulExample/json/product/get");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Accept", "application/json");

		if (conn.getResponseCode() != 200) {
			throw new RuntimeException("Failed : HTTP error code : "
					+ conn.getResponseCode());
		}

		BufferedReader br = new BufferedReader(new InputStreamReader(
			(conn.getInputStream())));

		String output;
		System.out.println("Output from Server .... \n");
		while ((output = br.readLine()) != null) {
			System.out.println(output);
		}

		conn.disconnect();

	  } catch (MalformedURLException e) {

		e.printStackTrace();

	  } catch (IOException e) {

		e.printStackTrace();

	  }

	}

}

Output…


Output from Server .... 

{"qty":999,"name":"iPad 3"}

2. POST Request

Review last REST service, accept “json” data and convert it into Product object, via Jackson provider automatically.


@Path("/json/product")
public class JSONService {

        @POST
	@Path("/post")
	@Consumes("application/json")
	public Response createProductInJSON(Product product) {

		String result = "Product created : " + product;
		return Response.status(201).entity(result).build();
		
	}
	//...

Java client to send a “POST” request, with json string.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class NetClientPost {

	// http://localhost:8080/RESTfulExample/json/product/post
	public static void main(String[] args) {

	  try {

		URL url = new URL("http://localhost:8080/RESTfulExample/json/product/post");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setDoOutput(true);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-Type", "application/json");

		String input = "{\"qty\":100,\"name\":\"iPad 4\"}";

		OutputStream os = conn.getOutputStream();
		os.write(input.getBytes());
		os.flush();

		if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
			throw new RuntimeException("Failed : HTTP error code : "
				+ conn.getResponseCode());
		}

		BufferedReader br = new BufferedReader(new InputStreamReader(
				(conn.getInputStream())));

		String output;
		System.out.println("Output from Server .... \n");
		while ((output = br.readLine()) != null) {
			System.out.println(output);
		}

		conn.disconnect();

	  } catch (MalformedURLException e) {

		e.printStackTrace();

	  } catch (IOException e) {

		e.printStackTrace();

	 }

	}

}

Output…


Output from Server .... 

Product created : Product [name=iPad 4, qty=100]

Download Source Code

Download it – JAX-RS-Client-JavaURL-Example.zip (8 KB)

References

  1. Jackson Official Website
  2. java.net.URL JavaDoc
  3. java.net.HttpURLConnection JavaDoc

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
62 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Guest
6 years ago

using the above code i am not able to pass the request body to the api. the following code is not working for me:
String input = “{“qty”:100,”name”:”iPad 4″}”;

OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();

Guest
4 years ago
Reply to  Guest

When you get the parameter in the JSONService function you must use @RequestBody like this

public Response createProductInJSON(@RequestBody Product product) {}

maddy
6 years ago

Hi

Exception in thread “main” java.lang.RuntimeException: Failed : HTTP error code : 403

Preetam Chakraborty
4 years ago
Reply to  maddy

conn.setRequestProperty(“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36”);

dog
4 years ago
Reply to  maddy

you don’t have access to whatever URL you have

RG1000
5 years ago

Can you please share example to Call REST service with PATCH method .
I am getting below error.
java.net.ProtocolException: Invalid HTTP method: PATCH
at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:440)

Tia
6 years ago

I implemented the same code for PostClient but its returning the object and not the json as shown in output result..

As Shown above
Output from Server ….

Product created : Product [name=iPad 4, qty=100]

My implementation result
Output from Server ….

Product created atLL: com.rest.resteasy.DeviceVO@6f075e05

Sanjay Manna
4 years ago
Reply to  Tia

To get you data use ObjectMaper, actually this a class of jackson library, use the below line to get you actual response.
also you need to create a Product Class with setter and getter method
Product p= new ObjectMapper().readValue(output, Product.class);

srinivas
6 years ago

Can we create a connection from myapplication to any other website using api key with this example ? If it possible how ?

Vin
7 years ago

Hi,
I am trying to call Rest api and then parse the values .my code is throwing a null pointer exception at this stage .PLEASE can you help me
JSONArray jsonarr_1=(JSONArray)jobj.get(“collection”);
int n=(out1).length();
for (int i=0;i<n;++i)
{
JSONObject jsonobj_1=(out1).getJSONObject(i);/////////////null pointer exception
System.out.println("nSureLinks:"+jsonobj_1.get("element"));
}
}

Paxi
9 years ago

Hi,
I had a problem with this code, but successfully i got handle it (I set wrong parameters to setRequestProperty). Now my code is works, but i get an error message this part:

if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
throw new RuntimeException(“Failed : HTTP error code : ”
+ conn.getResponseCode());
}
My error code is 200, which it means everything ok. Why?

Soniya
4 years ago
Reply to  Paxi

Just use conn.getResposeCode() != 200 in your case (if 200 indicates a successful request)

Alabama Mothman
1 year ago

Thanx. You make it so a dummie like me can understand it.

NeedHelp
1 year ago

On my machine(client) is work fine, but on server machine(client) occur exception connection reset while conn.getOutputStream()

SATHISHKUMAR
1 year ago

tell me that how can i user the authorization (username, password ) in the URL??

Ricardo Morales
3 years ago

Thank you very much

Alexander
3 years ago

Merci !

Gabor
3 years ago

Hi mkyong, community,
trying the sample above, the GET functions very well, but I get a HTTP error 405 for the POST part. What can be the reason pls.?
FYKI, I create the .war in Netbeans, and deploy the .war onto a Tomcat server under Win 10.

Soniya Ahuja
4 years ago

Thanks… This saved me so much time…

Praveen
4 years ago

Hi,

I’m getting exception “javax.net.ssl.SSLHandshakeException” with this code ?

Regards,
PraveenP

Dustin Sanchez
5 years ago

Saludos, Actualmente estoy simulando la combinación de golang con java, esto motivado que ambos pueden trabajar con json.
El codigo de prueba de golang y funciona es el siguiente.
ackage main

import (
“encoding/json”
“log”
“net/http”
“github.com/gorilla/mux”
)

type Person struct {
ID string json:"id,omitempty"
FirstName string json:"firstname,omitempty"
LastName string json:"lastname,omitempty"
Address *Address json:"address,omitempty"
}

type Address struct {
City string json:"city,omitempty"
State string json:"state,omitempty"
}

var people []Person

// EndPoints
func GetPersonEndpoint(w http.ResponseWriter, req *http.Request){
params := mux.Vars(req)
for _, item := range people {
if item.ID == params[“id”] {
json.NewEncoder(w).Encode(item)
return
}
}
json.NewEncoder(w).Encode(&Person{})
}

func GetPeopleEndpoint(w http.ResponseWriter, req *http.Request){
json.NewEncoder(w).Encode(people)
}

func CreatePersonEndpoint(w http.ResponseWriter, req *http.Request){
params := mux.Vars(req)
var person Person
_ = json.NewDecoder(req.Body).Decode(&person)
person.ID = params[“id”]
people = append(people, person)
json.NewEncoder(w).Encode(people)

}

func DeletePersonEndpoint(w http.ResponseWriter, req *http.Request) {
params := mux.Vars(req)
for index, item := range people {
if item.ID == params[“id”] {
people = append(people[:index], people[index + 1:]…)
break
}
}
json.NewEncoder(w).Encode(people)
}

func main() {
router := mux.NewRouter()

// adding example data
people = append(people, Person{ID: “1”, FirstName:”Ryan”, LastName:”Ray”, Address: &Address{City:”Dubling”, State:”California”}})
people = append(people, Person{ID: “2”, FirstName:”Maria”, LastName:”Ray”})

// endpoints
router.HandleFunc(“/people”, GetPeopleEndpoint).Methods(“GET”)
router.HandleFunc(“/people/{id}”, GetPersonEndpoint).Methods(“GET”)
router.HandleFunc(“/people/{id}”, CreatePersonEndpoint).Methods(“POST”)
router.HandleFunc(“/people/{id}”, DeletePersonEndpoint).Methods(“DELETE”)

log.Fatal(http.ListenAndServe(“:3000”, router))
}

El codigo en java es el siguiente.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class NetClientGet {

// http://localhost:8080/RESTfulExample/json/product/get
public static void main(String[] args) {

try {

URL url = new URL(“localhost:3000/people/”);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“Accept”, “application/json”);

if (conn.getResponseCode() != 200) {
throw new RuntimeException(“Failed : HTTP error code : ”
+ conn.getResponseCode());
}

BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));

String output;
System.out.println(“Output from Server …. \n”);
while ((output = br.readLine()) != null) {
System.out.println(output);
}

conn.disconnect();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

Quiero combinar dichos lenguajes, para evaluar su eficiencia y sencilles en construccion, mas otros aspectos, pero me estoy encontrando que java responde con el siguiente error y honestamente no entiendo el porque, disculpen mi falta de conocimiento, pero estoy investigando para evaluar su rendimiento y eficiencia.
java.net.MalformedURLException: unknown protocol: localhost
at java.net.URL.(Unknown Source)
at java.net.URL.(Unknown Source)
at java.net.URL.(Unknown Source)

Mil Gracias.

asd
6 years ago

i am getting 411 exception

SUMIT
6 years ago

Hey, I have solution for this

Kanishk Jadhav
6 years ago

Hi,
I am getting below exception at “DataOutputStream wr = new DataOutputStream(con.getOutputStream());” this statement.
“javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?”

Below is the code:
HttpURLConnection con;
String inputLine;
StringBuffer response=null;

try {
URL obj = new URL(null, url, new sun.net.www.protocol.https.Handler());
con = (HttpURLConnection) obj.openConnection(); //(HttpsURLConnection)

con.setRequestMethod(“POST”);
con.addRequestProperty(“Content-Type”,”application/json”);

for(Map.Entry prop : header.entrySet()) {
con.setRequestProperty(prop.getKey(),prop.getValue());
}

con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(postParameters);
wr.flush();
wr.close();

Jesus David Sanchez Suarez
7 years ago

I have an error consuming the service:
java.net.ConnectException: Connection refused: connect….
I could not find any errors

MARIO GOMES
7 years ago

;Hi Mkyong

Can you help me where i can send the : “chave”:45150819652219000198550990000000011442380343 in json method GET
?

curl -X GET
-H “X-Consumer-Key: SEU_CONSUMER_KEY”
-H “X-Consumer-Secret: SEU_CONSUMER_SECRET”
-H “X-Access-Token: SEU_ACCESS_TOKEN”
-H “X-Access-Token-Secret: SEU_ACCESS_TOKEN_SECRET”
-H “Content-Type: application/json”
-d ‘{“chave”:45150819652219000198550990000000011442380343}’

Sanket Khandekar
7 years ago

Hi Nice Post

Just wanted to know if my url is https will this allow ?

Partha Malik
8 years ago

I need to put “application/json; version=1” in request header but that gives a parse exception. How to solve that??

Justin Amburn
8 years ago

So many high quality tutorials on this website. Has saved much time with building/consuming REST service and API. Thank you very much.

Asif Malek
8 years ago

Thanks mkYong..for saving my job :)… keep it up

spikeTJ
8 years ago

Hi! i have to build a rest client for a Maven, Spring and cxf web services? Its thats way above works? Thanks for your help!

Pratap A.K
8 years ago

You are such an excellent guide, nice tutorial
Thanks for the topic

Ali Abbas
8 years ago

I’m getting below error while calling getOutputStream in Delete request.

ERROR : java.net.ProtocolException: HTTP method DELETE doesn’t support output

What i wanted is to call delete request with body.

Any help will be highly appreciated 🙂

Bikash Singh
9 years ago

Use below additional dependency to fix the issue.

com.sun.jersey

jersey-json

1.8

John
9 years ago

Hi,

I’m getting this error: Connection refused: connect.

in this line: OutputStream os = conn.getOutputStream();

Can you help me with this issue ?

Thank you in advance..