使用Apache HTTP Client 4.5 vs Jersey进行改造的Jersey REST客户端

Chr*_*Sim 23 java rest apache-httpclient-4.x jersey-client retrofit

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

对于Java客户端应用程序,Retrofit是否更好.或者它对Android更好吗?为什么我之前没有找到这个比较......他们无法比较?

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

HTTP3不支持连接池,这就是为什么通常用于android的改造?所以对于普通的java应用程序来说,它将导致连接泄漏是不切实际的.

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

先感谢您

aha*_*aha 33

你把不同的东西混合在一起.事先清理事情:

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

每个库都使用下面的HTTP客户端实际与HTTP服务器通信.示例是您提到的Apache HTTP客户端,OkHttp或随JDK一起提供的普通HttpUrlConnection.

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

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

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

JRE/JDK:您可以在这里选择各种选项.

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

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


Chr*_*Sim 7

花了一段时间才找到,但是我找到了完美的 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);
}
Run Code Online (Sandbox Code Playgroud)

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

JRE/JDK:在这里您可以选择完整的选项。

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

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

如果您想在客户端和服务器之间共享接口定义,或者您完全使用 JavaEE,JAX-RS(Jersey、RESTeasy 等)是一个不错的选择。

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