Cliente JAX-RS com Jersey

Cliente JAX-RS com Jersey

1. Visão geral

Jersey é uma estrutura de código aberto para o desenvolvimento de serviços Web RESTFul. Ele também possui excelentes recursos de cliente embutidos.

Neste tutorial rápido, exploraremos a criação do cliente JAX-RS usandoJersey 2.

Para uma discussão sobre a criação de RESTful Web Services usando Jersey, consultethis article.

Leitura adicional:

API REST com Jersey e Spring

Criando serviços da Web repousantes usando Jersey 2 e Spring.

Read more

CORS em JAX-RS

Aprenda como implementar o mecanismo de compartilhamento de recursos de origem cruzada (CORS) em aplicativos baseados em JAX-RS.

Read more

Filtros e interceptores de Jersey

Veja como os filtros e interceptores funcionam na estrutura de Jersey.

Read more

2. Dependências do Maven

Vamos começar adicionando as dependências necessárias (para o cliente Jersey JAX-RS) nopom.xml:


    org.glassfish.jersey.core
    jersey-client
    2.25.1

Para usar o Jackson 2.x como provedor JSON:


    org.glassfish.jersey.media
    jersey-media-json-jackson
    2.25.1

A versão mais recente dessas dependências pode ser encontrada emjersey-clientejersey-media-json-jackson.

3. Cliente RESTFul em Jersey

Iremos desenvolver um cliente JAX-RS para consumir as APIs JSON e XML REST que desenvolvemoshere (precisamos ter certeza de que o serviço está implementado e a URL está acessível).

3.1. Classe de representação de recursos

Vamos dar uma olhada na classe de representação de recursos:

@XmlRootElement
public class Employee {
    private int id;
    private String firstName;

    // standard getters and setters
}

Anotações JAXB como@XmlRootElement são necessárias apenas se o suporte XML for necessário.

3.2. Criação de uma instância deClient

A primeira coisa que precisamos é uma instância de aClient:

Client client = ClientBuilder.newClient();

3.3. Criando umWebTarget

Assim que tivermos a instânciaClient, podemos criar umWebTarget usando o URI do recurso da web de destino:

WebTarget webTarget
  = client.target("http://localhost:8082/spring-jersey");

UsandoWebTarget, podemos definir um caminho para um recurso específico:

WebTarget employeeWebTarget
  = webTarget.path("resources/employees");

3.4. Construindo uma Invocação de Solicitação HTTP

Uma instância do construtor de invocação é criada com um dos métodosWebTarget.request():

Invocation.Builder invocationBuilder
  = employeeWebTarget.request(MediaType.APPLICATION_JSON);

Para o formato XML,MediaType.APPLICATION_XML pode ser usado.

3.5. Invocar solicitações HTTP

Chamando HTTP GET:

Response response
  = invocationBuilder.get(Employee.class);

Chamando HTTP POST:

Response response
  = invocationBuilder
  .post(Entity.entity(employee, MediaType.APPLICATION_JSON);

3.6. Cliente REST de amostra

Vamos começar a escrever um cliente REST simples. O métodogetJsonEmployee() recupera um objetoEmployee com base no funcionárioid. O JSON retornado porREST Web Service é desserializado para o objetoEmployee antes de retornar.

Usando a API JAX-RS fluentemente para criar um destino da web, um construtor de chamadas e uma solicitação GET HTTP:

public class RestClient {

    private static final String REST_URI
      = "http://localhost:8082/spring-jersey/resources/employees";

    private Client client = ClientBuilder.newClient();

    public Employee getJsonEmployee(int id) {
        return client
          .target(REST_URI)
          .path(String.valueOf(id))
          .request(MediaType.APPLICATION_JSON)
          .get(Employee.class);
    }
    //...
}

Vamos agora adicionar um método para solicitação POST HTTP. O métodocreateJsonEmployee() cria umEmployee invocandoREST Web Service para a criação deEmployee. A API do cliente serializa internamente o objetoEmployee para JSON antes de invocar o método HTTP POST:

public Response createJsonEmployee(Employee emp) {
    return client
      .target(REST_URI)
      .request(MediaType.APPLICATION_JSON)
      .post(Entity.entity(emp, MediaType.APPLICATION_JSON));
}

4. Testando o cliente

Vamos testar nosso cliente com JUnit:

public class JerseyClientLiveTest {

    public static final int HTTP_CREATED = 201;
    private RestClient client = new RestClient();

    @Test
    public void givenCorrectObject_whenCorrectJsonRequest_thenResponseCodeCreated() {
        Employee emp = new Employee(6, "Johny");

        Response response = client.createJsonEmployee(emp);

        assertEquals(response.getStatus(), HTTP_CREATED);
    }
}

5. Conclusão

Neste artigo, apresentamos o cliente JAX-RS usando Jersey 2 e desenvolvemos um cliente Java RESTFul simples.

Como sempre, o código-fonte completo está disponível emthis Github project.