Fluent Java HTTP Client

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

在Java的世界中,有很多可以选择的HTTP客户端。然而,我决定创建一个新的客户端,因为其他的客户端都不能完全满足我的需求。也许,我要求太高了。不过,这就是当你发起一个HTTP请求并期望返回一个成功的HTML页面时,我的jcabi-http客户端的交互方式。

我在设计这个新客户端时考虑了以下要求:

对我来说,这是最重要的需求。客户端必须简单易用。在大多数情况下,我只需要发出一个HTTP请求并解析JSON响应来返回一个值。例如,这是我如何使用新客户端返回当前的欧元汇率:

我假设以上内容易于理解和维护。

新客户端必须流畅,这意味着整个服务器交互适应一个Java语句。为什么这很重要?我认为“流畅接口”是执行多个命令式调用的最紧凑和表达力最强的方式。据我所知,目前没有任何现有的库能够实现这种流畅性。

我是一个接口的忠实粉丝,主要是因为接口使得设计更加清晰和高度可扩展。在jcabi-http中,有五个接口被20个类扩展。

Request是一个接口,同时也是ResponseRequestURIRequestBody的公开接口。

使用接口使得库具有高度可扩展性。例如,我们有JdkRequestApacheRequest,它们使用两种完全不同的技术(JDK HttpURLConnection 和 Apache HTTP Client)向服务器进行实际的HTTP调用。未来,可以引入新的实现而不破坏现有代码。

比如说,我想获取一个页面然后对其进行操作。这两个调用方法执行任务的方式不同,但最终结果相同。

XML and JSON Out-of-the-Box

有两个常见的标准,我希望该库能够直接支持。在大多数情况下,从服务器检索到的响应是以XML或JSON格式。对于我来说,解析输出以解决格式问题一直都是一种麻烦和额外的工作。

jcabi-http客户端从一开始就支持这两种格式,并且可以根据需要在将来添加更多格式。例如,您可以获取XML并从其元素中检索字符串值。

基本上,fetch() 产生的响应由 XmlResponse 装饰。这就暴露了 xml() 方法,该方法返回一个 XML 接口的实例。

通过 Java JSON API(JSR-353)也可以做到同样的事情。

我所了解和使用过的任何库都没有提供这个功能。

最后一个要求,但绝对不是最不重要的,是我需要库的所有接口都要用@Immutable进行注释。这很重要,因为我需要能够将Request的实例封装在其他不可变类中。

ps. 这篇文章的简短摘要已在JavaLobby上发布。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 10:34

sixnines availability badge   GitHub stars