假设我需要编写一个 Java 客户端,它调用一个 REST API(使用 HTTP GET)。我知道它默认返回 JSON 格式的数据,我不需要提供任何标题。
现在我可以使用Apache调用HttpClient
API或直接读取 URL(从 URL 中获取流url.openStream
并读取数据)。第二种方法在我看来要简单得多。你会推荐哪一个,为什么?
假设我需要编写一个 Java 客户端,它调用一个 REST API(使用 HTTP GET)。我知道它默认返回 JSON 格式的数据,我不需要提供任何标题。
现在我可以使用Apache调用HttpClient
API或直接读取 URL(从 URL 中获取流url.openStream
并读取数据)。第二种方法在我看来要简单得多。你会推荐哪一个,为什么?
所有 REST 客户端都提供了基于基本 java URL 的 API 的包装器。这些客户端易于使用并提供所有必要的功能。如果您使用 Apache HttpClient,您的代码会更加简洁。而且 Apache 的 API 相当可靠。
我会为此使用特殊的库,例如 Jersey 客户端或 Apache CXF 客户端。 https://jersey.java.net/documentation/latest/client.html http://cxf.apache.org/docs/jax-rs.html
这些是 Java EE 标准的一部分,这是一个广泛使用的定义良好的规范。
对于 JSON,请考虑https://github.com/FasterXML/jackson。根据您使用的客户端,您将找到有关如何使其工作的信息。
如果您不是 JavaEE 的忠实粉丝,并且您正在寻找简洁优雅的 API,并且您对在 Java 之上使用一种语言感兴趣,那么Groovy HTTPBuilder就是这样一个像魅力一样工作的库!
twitter = new RESTClient( 'https://twitter.com/statuses/' )
resp = twitter.post( path : 'update.xml',
body : [ status:msg, source:'httpbuilder' ],
requestContentType : URLENC )
assert resp.status == 200
assert resp.data.user.screen_name == userName
您可以使用 spring-data-rest 和 Spring 的 RestTemplate。无需编写 webapp,因为您可以轻松地将 Spring 引导到放入AnnotationConfigApplicationContext
Main() 的独立 java 应用程序中。这很简单。
例如,假设您有一个 Restful URL,http://localhost:8080/croot/books/
它返回书籍列表(反序列化为 Book 类型的对象)。
使用 Spring 的 RestTemplate,您可以执行以下操作:
public Resource<List<Resource<Book>>> findAll() {
return restTemplate
.exchange(
"http://localhost:8080/croot/books/",
HttpMethod.GET,
null,
new ParameterizedTypeReference<Resource<List<Resource<Book>>>>() {
}).getBody();
}
您还可以使用 spring-data-hateoas 处理此问题,从而使您可以进一步将客户端与服务器分离,并帮助处理下一步要做什么,例如在分页中。
这是一个非常简化/人为的示例,但 Spring 3 中的 REST 支持与 spring-data 框架相结合非常优雅。
使用 Spring,您还可以获得 Jackson 进行 JSON 处理的优势,因为在用于处理的默认转换器列表RestTemplate
中将具有 Jackson 消息转换器的一种风格(MappingJackson2HttpMessageConverter
例如通过提供)。