如何为外部世界REST服务创建REST客户端

SHA*_*SHA 2 java jax-rs rest-client

如何使用JAX-RS Client流畅的API为外部世界REST服务创建休息客户端?

例如,假设服务返回具有两个字段名称和年龄的人物对象.

无论我遇到什么示例/教程,它们都会执行与下面代码段相同的操作,或者他们在同一个项目中开发客户端,以便用person.class替换String.class.我应该如何创建独立的客户端,让我回归人.

String entity = client.target("http://example.com/rest")
        .path("resource/helloworld")
        .queryParam("greeting", "Hi World!")
        .request(MediaType.TEXT_PLAIN_TYPE)
        .header("some-header", "true")
        .get(String.class);
Run Code Online (Sandbox Code Playgroud)

cas*_*lin 7

请求实体并将其映射到Java类

例如,考虑使用REST API,它在执行GET请求时提供以下JSON http://example.com/api/people/1:

{
  "name": "John Doe",
  "age": 25
}
Run Code Online (Sandbox Code Playgroud)

上面的JSON可以映射到Java类,定义如下:

public class Person {

    private String name;

    private Integer age;

    // Constructor, getters and setters omitted
}
Run Code Online (Sandbox Code Playgroud)

使用JAX-RS客户端API,可以按如下方式请求JSON,将请求的实体映射到Person类:

Client client = ClientBuilder.newClient();
Person person = client.target("http://example.com/api")
                      .path("people").path("1")
                      .request(MediaType.APPLICATION_JSON)
                      .get(Person.class);

String name = person.getName();
Integer age = person.getAge();
Run Code Online (Sandbox Code Playgroud)

JAX-RS客户端API是JAX-RS 2.0规范的一部分,参考实现是Jersey.

为了解析JSON,Jersey提供了一组用于多个框架的扩展模块,这些模块提供对JSON处理和/或JSON到Java绑定的支持.Jersey支持MOXy,JSON-P,JacksonJettison.有关更多详细信息,请查看文档.

手动解析JSON

如果由于某种原因,您需要手动解析所请求的实体,则可以将请求的实体存储在String:

Client client = ClientBuilder.newClient();
String json = client.target("http://example.com/api")
                    .path("people").path("1")
                    .request(MediaType.APPLICATION_JSON)
                    .get(String.class);
Run Code Online (Sandbox Code Playgroud)

然后可以使用例如Jackson手动解析所请求的实体:

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);

String name = node.path("name").asText();
Integer age = node.path("age").asInt();
Run Code Online (Sandbox Code Playgroud)

要手动解析JSON,您还可以考虑使用Gson.

备择方案

有关如何使用Java使用REST API的替代方法,请查看此答案.