RESTful Java client with RESTEasy client framework
This tutorial show you how to create a RESTful Java client with RESTEasy client framework, to perform “GET” and “POST” requests to REST service that created in last “Jackson + JAX-RS” tutorial.
1. RESTEasy Client Framework
RESTEasy client framework is included in RESTEasy core module, so, you just need to declares the “resteasy-jaxrs.jar” in your pom.xml
file.
File : pom.xml
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.2.1.GA</version>
</dependency>
2. GET Request
Review last REST service.
@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;
}
//...
RESTEasy client to send a “GET” request.
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.client.ClientProtocolException;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ClientResponse;
public class RESTEasyClientGet {
public static void main(String[] args) {
try {
ClientRequest request = new ClientRequest(
"http://localhost:8080/RESTfulExample/json/product/get");
request.accept("application/json");
ClientResponse<String> response = request.get(String.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(response.getEntity().getBytes())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Output…
Output from Server ....
{"qty":999,"name":"iPad 3"}
3. POST Request
Review last REST service also.
@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();
}
//...
RESTEasy client to send a “POST” request.
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ClientResponse;
public class RESTEasyClientPost {
public static void main(String[] args) {
try {
ClientRequest request = new ClientRequest(
"http://localhost:8080/RESTfulExample/json/product/post");
request.accept("application/json");
String input = "{\"qty\":100,\"name\":\"iPad 4\"}";
request.body("application/json", input);
ClientResponse<String> response = request.post(String.class);
if (response.getStatus() != 201) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(response.getEntity().getBytes())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Output…
Output from Server ....
Product created : Product [name=iPad 4, qty=100]
Download Source Code
Download it – RESTful-Java-Client-RESTEasyt-Example.zip (9 KB)
nice simple tutorial
Isn’t the idea of REST to be more noun centric than verb centric.
you have get and post in the URLs. Should it have ended at
…/product/
and then you either make a get call or post call and in the JsonService it will either call the method that is annotated with @GET or with @POST, Just making sure i get the idea correctly.
how to access the https urls?
the code build well while i am running client class getting this error .
java.net.ConnectException: Connection refused: connect
Could you please update your tutorial to use reasteasy version 3.0.x version? It would help a lot to me..
How can I test a REST request using JUnit?
I tried to implement a similar client, but I need to also set a timeout for the connection. Is there a way to do it?
every way I try doesn’t work (currently I am trying to create a client request with an executor, but it does not work)
while using the above code, I am getting following error :
java.lang.RuntimeException: Failed : HTTP error code : 500
at com.mkyong.rest.client.RESTEasyClientGet.main(RESTEasyClientGet.java:22)
Hi.
How can i use Resteasy without maven ?
Thanks. It helped me.
Hi,if I set this json to chinese,there is a error
String input = “{\”qty\”:100,\”name\”:\”iPad 4\”}”;=>String input = “{\”qty\”:100,\”name\”:\”??\”}”;
could you pls help?Thanks a lot 😀
Hi I´m pretty new in rest, but I will like to know how I can notify my client when a new item is added? something like MVC I guess
Thanks
i look for this too !!
maybe web-socket resolve the problem
I am getting the following error with a ClientResponseFailureException
“Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String”
I tried exactly the same code as yours. Can you please help me out?
Im getting the same error. please help
Download the latest RESTEasy package (3.0.1.Final) and in the lib folder you will find the jars you need to include in your project. To fix this particular error, you need to include the various jackson related jars (jackson-jaxrs-1.9.12.jar, jackson-mapper-asl-1.9.12.jar, etc.)
I’m getting “peer not authenticated” error when I’m trying to use SSL/HTTPS configuration in production environment JBoss 7AS. But works like a charm with HTTP, Is there any configuration to be added that I’m missing?
while running post code i’m getting below error. any clue? I have added all required jars to build path as well.
Exception in thread “main” java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.jboss.resteasy.core.LoggerCategories.getLogger(LoggerCategories.java:64)
at org.jboss.resteasy.core.LoggerCategories.getProviderLogger(LoggerCategories.java:86)
at org.jboss.resteasy.plugins.providers.RegisterBuiltin.(RegisterBuiltin.java:22)
at org.jboss.resteasy.spi.ResteasyProviderFactory.getInstance(ResteasyProviderFactory.java:324)
at org.jboss.resteasy.client.ClientRequest.(ClientRequest.java:135)
at org.jboss.resteasy.client.ClientRequest.(ClientRequest.java:130)
at org.jboss.resteasy.client.ClientRequest.(ClientRequest.java:125)
at com.ca.saas.deployment.deployment.main(deployment.java:18)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
… 8 more
Reading the JSON string seems to work ok but RESTEasy stumbles with unmarshaling the response even for a simple POJO. When I tried, I got the following:
<pre lang="java"
org.jboss.resteasy.client.ClientResponseFailure: Unable to find a MessageBodyReader of content-type text/html and type null
at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:522)
at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:513)
at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:414)
at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:376)
at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:337)
at name.app.abhi.imdb.api.accessor.IMDBAPIClient.getMovieInfo(IMDBAPIClient.java:37)
at name.app.abhi.imdb.api.accessor.IMDBAPIClientTest.testSendRequestByProxy(IMDBAPIClientTest.java:19)
What is your last error caused by?
It was caused by RESTEasy. I figured it out as below:
where res is a reference to ClientResponse and genericType is a subclass of Movie.