泽西 REST 客户端与 Apache HTTP 客户端 4.5 与改造

我正在阅读许多文章以找到Java应用程序的最佳Rest Client,我发现最终将Jersey与Apache HTTP客户端4.5结合使用非常棒,但在很多文章中,我发现现在Retrofit是最好的(我没有提到Volley,因为在我的情况下,我不需要API支持缓存。

改造是否更适合 Java 客户端应用程序。还是它只是更适合机器人?以及为什么我之前没有找到这个比较..它们无法比较?

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

HTTP3不支持连接池,这就是为什么改造通常用于Android?因此,对于会导致连接泄漏的普通Java应用程序而言,这是不切实际的。

我的目标是找到具有高性能并支持大量连接的最佳 Rest API 客户端。

提前感谢您


答案 1

你把不同的东西混合在一起。要预先解决问题::

改造是一个与 REST API 交互的客户端库。因此,它提供了与JerseyRESTeasy或Spring's RestTemplate相同的抽象级别。它们都允许使用类型安全的API与REST API进行交互,而无需处理序列化,请求构建和响应处理等低级方面。

这些库中的每一个都使用下面的HTTP客户端来实际与HTTP服务器通信。例如您提到的Apache HTTP客户端OkHttp或JDK附带的普通HttpUrlConnection

除了改造之外,您通常可以混合和匹配不同的REST客户端库和HTTP客户端,因为自版本2以来,Retrofit对OkHttp具有硬依赖性(使用Retrofit 1.x,您可以使用Apache HTTP Client,HttpUrlConnection或OkHttp)。

回到实际问题:什么时候选择什么。

Android:这很容易,因为JAX-RS,Jersey和RESTeasy背后的API/技术在Android上不受支持。因此,改造或多或少是你唯一的选择,除了Volley,如果你不想直接谈论HTTP。Spring也不可用,Spring Android被放弃了

JRE/JDK:在这里,您有充分的选择。

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

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


答案 2

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

它被称为Feign,由Netflix团队开发,并与Spring Cloud Netflix合作。更多详细信息,请访问该项目的网站。

一些功能包括: - 与Jackson,Gson和其他编码器/解码器集成 - 使用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:在这里,您有充分的选择。

如果您想要一个快速简便的解决方案来实现没有 SDK 或 JAX-RS 接口的第三方 API,那么改造可能会很好。

Spring的RestTemplate是一个不错的选择,如果你使用的是Spring并且没有JAX-RS接口,或者你不想购买JAX-RS,即在服务器端也使用它。

JAX-RS(Jersey,RESTeasy,...)是一个不错的选择,如果你想在客户端和服务器之间共享接口定义,或者如果你无论如何都在JavaEE上全力以赴。

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