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

标签 java jax-rs rest-client

如何使用 JAX-RS Client fluent API 为外部世界 REST 服务创建一个 REST 客户端?

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

无论我遇到什么示例/教程,他们都会做与下面的代码片段相同的事情,或者他们在同一个项目中开发客户端,以便用 person.class 替换 String.class。我应该如何创建独立的客户,这将返回我的人的 pojo。

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);

最佳答案

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

例如,假设您正在使用一个 REST API,它在执行 GET 时提供以下 JSON请求 http://example.com/api/people/1 :

{
  "name": "John Doe",
  "age": 25
}

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

public class Person {

    private String name;

    private Integer age;

    // Constructor, getters and setters omitted
}

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

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();

JAX-RS 客户端 API 是 JAX-RS 2.0 的一部分。规范和引用实现是Jersey .

为了解析 JSON,Jersey 为多个框架提供了一组扩展模块,支持 JSON 处理和/或 JSON 到 Java 的绑定(bind)。泽西支持 MOXy , JSON-P , JacksonJettison .更多详情,请查看 documentation .

手动解析 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);

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

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

String name = node.path("name").asText();
Integer age = node.path("age").asInt();

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

备择方案

有关如何使用 Java 使用 REST API 的替代方法,请查看 this answer .

关于java - 如何为外部世界 REST 服务创建 REST 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36342472/

相关文章:

java - 从 html 文件中获取信息

java - 带有同步关键字的 Spring @Transactional 不起作用

java - "semi-public service"在Android中是什么意思?

java - DTO 在通过网络传输时如何自动序列化 (java)

java - 如何对调用 Jersey 客户端 API 的代码进行单元测试?

java - 我可以向 Solr 服务器动态提供 solrconfig.xml 和 schema.xml 文件吗?

java - 带有授权 header 的 AngularJS CORS

ruby - 如何让 Ruby 的 RestClient 使用多值查询参数?

java - 如何在 java 客户端禁用自签名证书?

java - 如何使用 Swagger codegen 开发一个简单的 REST 客户端?