【问题标题】:How to create REST client for external world REST services如何为外部世界 REST 服务创建 REST 客户端
【发布时间】:2017-01-17 20:07:31
【问题描述】:

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

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

无论我遇到什么示例/教程,他们都会做与下面 sn-p 相同的事情,或者他们在同一个项目中开发客户端,以便用 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);

【问题讨论】:

    标签: java jax-rs rest-client


    【解决方案1】:

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

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

    {
      "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 类:

    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 的绑定。 Jersey 支持 MOXy、JSON-P、Jackson 和 Jettison。更多详情,请查看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。

    【讨论】:

    • 感谢您的回复,我的问题是关于 REST 发布者是否有必要提供从 API 返回的对象的 POJO 或消费者需要根据 JOSN 响应创建 POJO 的标准做法,如果您提供一些示例来阅读那会很棒
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多