By kswaughs | Wednesday, November 25, 2015

CXF Rest Client to call REST service - GET method

I have a sample REST service with GET method running in my local system. This method is used to fetch user details..

The URL is 'http://127.0.0.1:8080/camel-rest-0.0.1-SNAPSHOT/user/details/123'

Response is

{
   "status": "Success",
   "id": "123",
   "name": "kswaughs"
}

Create a model object to parse JSON response into java object.

Response Object - User
package com.example.cxfrs.beans;

public class User {

 private String status;

 private String id;

 private String name;

 public String getStatus() {
  return status;
 }

 public void setStatus(String status) {
  this.status = status;
 }

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 @Override
 public String toString() {
  StringBuilder builder = new StringBuilder();
  builder.append("User [status=");
  builder.append(status);
  builder.append(", id=");
  builder.append(id);
  builder.append(", name=");
  builder.append(name);
  builder.append("]");
  return builder.toString();
 } 
}

A simple stand-alone client code using WebClient and JacksonJsonProvider.

Sample Client code to call get Method
package com.example.cxfrs;

import java.util.ArrayList;
import java.util.List;

import com.example.cxfrs.beans.User;
import org.apache.cxf.jaxrs.client.WebClient;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;

public class CXFRestClient {

 public static void main(String[] args) {

  List<Object> providers = new ArrayList<Object>();
  providers.add(new JacksonJsonProvider());

  WebClient client = WebClient
    .create("http://127.0.0.1:8080/camel-rest-0.0.1-SNAPSHOT/user/details", providers);
  
  User user = client.accept("application/json").type("application/json")
    .path("123").get(User.class);

  System.out.println(user);
 }
}

Output is

User [status=Success, id=123, name=kswaughs]

Use Below maven dependency in your pom.xml to use CXF Client

<!-- To use WebClient API -->
<dependency>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-rt-rs-client</artifactId>
 <version>3.1.2</version>
</dependency>
<!-- To parse JSON String to Java objects --> 
<dependency>
 <groupId>org.codehaus.jackson</groupId>
 <artifactId>jackson-jaxrs</artifactId>
 <version>1.9.0</version>
</dependency> 

If you dont provide JacksonJsonProvider to WebClient, You will get below error while parsing the JSON response.

 
org.apache.cxf.jaxrs.utils.JAXRSUtils logMessageHandlerProblem
SEVERE: No message body reader has been found for class com.example.cxfrs.beans.User, ContentType: application/json
Exception in thread "main" javax.ws.rs.client.ResponseProcessingException: No message body reader has been found for class org.apache.camel.example.cxfrs.beans.User, ContentType: application/json
 at org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:433)
 at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:384)
 at org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:512)
 at org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:1173)
 at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1156)
 at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1092)
 at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:894)
 at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:865)
 at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:428)
 at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:611)
 at com.example.cxfrs.CXFRestClient.main(CXFRestClient.java:21)

Recommend this on


2 comments:

  1. Thanks for the article. It helped me a lot.

    ReplyDelete
  2. This helped me as well. Thanks for posting.

    ReplyDelete