0

假设我需要编写一个 Java 客户端,它调用一个 REST API(使用 HTTP GET)。我知道它默认返回 JSON 格式的数据,我不需要提供任何标题。

现在我可以使用Apache调用HttpClientAPI直接读取 URL(从 URL 中获取流url.openStream并读取数据)。第二种方法在我看来要简单得多。你会推荐哪一个,为什么?

4

4 回答 4

1

所有 REST 客户端都提供了基于基本 java URL 的 API 的包装器。这些客户端易于使用并提供所有必要的功能。如果您使用 Apache HttpClient,您的代码会更加简洁。而且 Apache 的 API 相当可靠。

于 2013-11-06T08:43:07.760 回答
1

我会为此使用特殊的库,例如 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。根据您使用的客户端,您将找到有关如何使其工作的信息。

于 2013-11-06T09:22:46.347 回答
1

如果您不是 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
于 2013-11-06T09:36:23.973 回答
0

您可以使用 spring-data-rest 和 Spring 的 RestTemplate。无需编写 webapp,因为您可以轻松地将 Spring 引导到放入AnnotationConfigApplicationContextMain() 的独立 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例如通过提供)。

于 2013-11-06T18:22:10.423 回答