web-dev-qa-db-ja.com

Jersey REST Apache HTTPクライアント4.5を備えたクライアントとレトロフィット

Javaアプリケーションに最適なレストクライアントを見つけるために多くの記事を読んでいたが、最終的にジャージーをApache HTTPクライアント4.5と共に使用するのは素晴らしいことでしたが、多くの記事で今レトロフィットが最適であることがわかりました(私の場合、APIがキャッシュをサポートしている必要はないので、Volleyについては言及しませんでした。

RetrofitはJavaクライアントアプリケーションに向いていますか、それともAndroidに向いていますか?そして、なぜこの比較が前に見つからなかったのですか?

パフォーマンス、接続プーリング、どのレイヤーで機能するか、リクエストとレスポンスの圧縮、タイムアウト、逆シリアル化を比較できますか?

HTTP3は接続プーリングをサポートしていません。これは、通常、Android ??にレトロフィットが使用される理由です。したがって、通常のJava接続リークが発生します。

私の目標は、高性能で最高のREST APIクライアントを見つけ、多数の接続をサポートすることです。

前もって感謝します

22
Chris Sim

さまざまなものを混ぜています。前もって物事をクリアするには:

Retrofit は、REST APIと対話するクライアントライブラリです。そのため、 JerseyRESTeasyと同じ抽象化レベルを提供します。 またはSpringの RestTemplate 。これらはすべて、シリアル化、要求構築などの低レベルの側面を処理することなく、タイプセーフAPIを使用してREST APIと対話できます。および応答処理。

これらの各ライブラリは、その下のHTTPクライアントを使用して、実際にHTTPサーバーと通信します。例は Apache HTTPクライアント あなたが言及したことです OkHttp または昔ながらの HttpUrlConnection JDKと共に出荷します。

通常、別のREST Retrofitを除くクライアントライブラリとHTTPクライアントを組み合わせて使用​​できます Retrofitはバージョン2以降、OkHttpに強く依存しているため (Retrofit 1.xで) Apache HTTPクライアント、HttpUrlConnection、またはOkHttpを使用できます)。

実際の質問に戻る:いつ選択するか。

Android:ここでは簡単です- JAX-RS 、ジャージーとRESTeasyの背後にあるAPI /テクノロジーはAndroidではサポートされていないためです。したがって、HTTPを直接話したくない場合は、多分Volleyを除き、Retrofitは多かれ少なかれ唯一のオプションです。 Springも利用できず、 Spring Android is abandoned

JRE/JDK:ここにはオプションの完全な選択肢があります。

  • SDKが利用できないサードパーティAPIまたはJAX-RSインターフェースを実装するための迅速で簡単なソリューションが必要な場合、レトロフィットはいいかもしれません。
  • SpringのRestTemplateは、Springを使用していて、JAX-RSインターフェイスがない場合、またはJAX-RSに購入したくない場合、つまりサーバー側で使用する場合に適しています。
  • JAX-RS(Jersey、RESTeasy、…)は、クライアントとサーバー間でインターフェース定義を共有したい場合や、とにかくJavaEEにオールインしている場合に適しています。

パフォーマンスについて:ここでの主なドライバーは、HTTPおよび(デ)シリアル化に費やされる時間です。ジャクソンやプロトブフなどの特殊なライブラリによって(デ)シリアル化が実行され、すべてが同じものを使用するため(または少なくともそれらを作成できます)、意味のある違いはないはずです。

31
aha

見つけるのに少し時間がかかりましたが、開発を宣言的で簡単にする完璧なRESTクライアントライブラリを見つけました。これを新しいREST実装またはAPI。

これは、Netflixチームによって開発され、Spring Cloud Netflixと連携するようになったFeignと呼ばれます。詳細 こちら プロジェクトのサイトで。

次の機能が含まれます。-Jackson、Gson、およびその他のエンコーダー/デコーダーとの統合-ネットワーク通信に実績のあるHTTPライブラリーとしてOkHttpを使用-ロギング機能に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が利用できないサードパーティAPIまたはJAX-RSインターフェースを実装するための迅速で簡単なソリューションが必要な場合、レトロフィットはいいかもしれません。

SpringのRestTemplateは、Springを使用していて、JAX-RSインターフェイスがない場合、またはJAX-RSに購入したくない場合、つまりサーバー側で使用する場合に適しています。

JAX-RS(Jersey、RESTeasy、…)は、クライアントとサーバー間でインターフェース定義を共有したい場合や、とにかくJavaEEにオールインしている場合に適しています。

Feignは、レトロフィットとJAX-RSの両方のように機能します。簡単なソリューションであり、クライアントとサーバー間でインターフェース定義を共有でき、JAX-RSインターフェースを使用できます。

4
Chris Sim