如何使用JAX-RS client fluent API为外部世界的rest服务创建一个rest客户端?
例如,假设一个服务返回一个具有两个字段名称和年龄的人员对象。
无论我遇到什么例子/教程,他们都会做与下面片段相同的事情,或者他们在同一个项目中开发客户端,以便用person.class替换String.class。我应该如何创建独立的客户端来返回我的pojo of person。
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,该API在http://example.com/api/people/1
上执行GET
请求时提供以下JSON:
{
"name": "John Doe",
"age": 25
}
上面的JSON可以映射到Java类,定义如下:
public class Person {
private String name;
private Integer age;
// Constructor, getters and setters omitted
}
使用JAX-RSClientneneneba 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-RSClientneneneba API是JAX-RS2.0规范的一部分,参考实现是Jersey。
为了解析JSON,Jersey为多个框架提供了一组扩展模块,这些模块支持JSON处理和/或JSON到Java绑定。泽西岛支持MOXy、JSON-P、Jackson和Jettison。有关更多详细信息,请查看文档。
手动解析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使用RESTAPI的替代方案,请查看以下答案。