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)
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();
When you get the parameter in the JSONService function you must use @RequestBody like this
public Response createProductInJSON(@RequestBody Product product) {}
Hi
Exception in thread “main” java.lang.RuntimeException: Failed : HTTP error code : 403
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”);
you don’t have access to whatever URL you have
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)
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
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);
Can we create a connection from myapplication to any other website using api key with this example ? If it possible how ?
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"));
}
}
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?
Just use conn.getResposeCode() != 200 in your case (if 200 indicates a successful request)
Thanx. You make it so a dummie like me can understand it.
On my machine(client) is work fine, but on server machine(client) occur exception connection reset while conn.getOutputStream()
tell me that how can i user the authorization (username, password ) in the URL??
Thank you very much
Merci !
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.
Thanks… This saved me so much time…
Hi,
I’m getting exception “javax.net.ssl.SSLHandshakeException” with this code ?
Regards,
PraveenP
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.
i am getting 411 exception
Hey, I have solution for this
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();
I have an error consuming the service:
java.net.ConnectException: Connection refused: connect….
I could not find any errors
;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}’
Hi Nice Post
Just wanted to know if my url is https will this allow ?
https://mkyong.com/java/java-https-client-httpsurlconnection-example/
I need to put “application/json; version=1” in request header but that gives a parse exception. How to solve that??
So many high quality tutorials on this website. Has saved much time with building/consuming REST service and API. Thank you very much.
Thanks mkYong..for saving my job :)… keep it up
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!
You are such an excellent guide, nice tutorial
Thanks for the topic
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 🙂
Use below additional dependency to fix the issue.
com.sun.jersey
jersey-json
1.8
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..