Jersey REST 客户端与 Apache HTTP 客户端 4.5 对比改造

Jersey REST client with Apache HTTP Client 4.5 vs retrofit

我阅读了很多文章来寻找 java 应用程序的最佳 Rest 客户端,我最终发现将 Jersey 与 Apache HTTP 客户端 4.5 一起使用很棒,但在很多文章中我发现现在 Retrofit 是最好的(我没有提到 排球,因为在我的情况下,我不需要 API 支持缓存。

Retrofit 是否更适合 java 客户端应用程序。还是 android 更好?为什么我之前没有找到这个比较..他们不能比较?

我可以比较它们的性能、连接池、它们在哪一层工作、请求和响应的压缩、超时、反序列化吗?

HTTP3 不支持连接池,这就是为什么 android 通常使用 retrofit 吗??所以对于普通的 java 应用程序来说是不实用的,它会导致连接泄漏。

我的目标是找到性能最好的 Rest API 客户端,并支持大量连接。

提前致谢

你把不同的东西混在一起了。预先清理一下:

Retrofit is a client library to interact with REST APIs. As such it offers the same abstraction level as Jersey, RESTeasy or Spring's RestTemplate。它们都允许使用类型安全 API 与 REST API 进行交互,而无需处理序列化、请求构建和响应处理等低级方面。

这些库中的每一个都在底层使用 HTTP 客户端与 HTTP 服务器进行实际对话。例如 Apache HTTP client that you mentioned, OkHttp or the plain-old HttpUrlConnection 与 JDK 一起发货。

您通常可以混合搭配不同的 REST 客户端库和 HTTP 客户端,Retrofit 除外 because Retrofit has a hard dependency on OkHttp since version 2(对于 Retrofit 1.x,您可以使用 Apache HTTP 客户端、HttpUrlConnection 或 OkHttp)。

回到真正的问题:什么时候选什么。

Android:这里很简单因为JAX-RS, the API/technology behind Jersey and RESTeasy isn't supported on Android. Hence Retrofit is more or less your only option except maybe Volley if you don't want to talk HTTP directly. Spring isn't available either and Spring Android is abandoned.

JRE/JDK: 在这里你有完整的选择。

  • 如果您想要一个快速简便的解决方案来实现没有可用 SDK 或 JAX-RS 接口的第三方 API,那么改造可能会很好。
  • 如果您正在使用
  • Spring 并且没有 JAX-RS 接口或者您不想购买 JAX-RS,那么
  • Spring 的 RestTemplate 是一个不错的选择,即在服务器端使用它。
  • JAX-RS(Jersey、RESTeasy 等)是一个不错的选择,如果您想在客户端和服务器之间共享接口定义,或者如果您无论如何都在使用 JavaEE。

关于性能:这里的主要驱动因素是执行 HTTP 和(反)序列化所花费的时间。因为(反)序列化是由像 Jackson 或 protobuf 这样的专门库执行的,并且都使用相同的(或者你至少可以让它们使用),所以应该没有任何有意义的区别。

我花了一段时间才找到,但我找到了完美的 REST 客户端库,它使我们的开发声明式且简单。在开发新的 REST 实现或 API 时,我们可以将其用作标准。

它叫做 Feign,由 Netflix 团队开发,用于 Spring Cloud Netflix。项目网站上的更多详细信息 here

一些功能包括: - 与 Jackson、Gson 和其他 Encoders/Decoders 集成 - 使用 OkHttp 进行网络通信,一个经过验证的 HTTP 库 - 与 SLF4J 绑定以实现日志记录功能 - 基于接口的实现,最少的开发。下面是一个示例客户端:

@FeignClient("stores")
public interface StoreClient
{
   @RequestMapping(method = RequestMethod.GET, value = "/stores")
   List<Store> getStores();

   @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
   Store update(@PathVariable("storeId") Long storeId, Store store);
}

在 @aha 的回答后引用如下:

JRE/JDK: Here you have the full choice of options.

Retrofit might be nice if you want a quick and easy solution to implement a third-party API for which no SDK is available or JAX-RS interfaces.

Spring's RestTemplate is a good choice if you're using Spring and there are no JAX-RS interfaces or you don't want to buy into JAX-RS, i.e. also using it on the server-side.

JAX-RS (Jersey, RESTeasy, …) is a good choice if you want to share interface definitions between client and servers or if you're all-in on JavaEE anyway.

Feign 的工作方式类似于改造和 JAX-RS:简单的解决方案,可以在客户端和服务器之间共享接口定义,并且可以使用 JAX-RS 接口