JavaのRestTemplateでgzipを受け取る方法

こんにちは。 エキサイト株式会社の三浦です。

APIなどからのレスポンスは、サイズが小さいに越したことはありません。

レスポンスサイズを小さくする方法の1つに、レスポンスをgzipで圧縮するという方法があります。 API側でレスポンスをgzip圧縮して送信し、受け取り側で解凍して使用するというやり方です。

ですが、実はJavaのRestTemplateは、デフォルトではgzip圧縮したレスポンスを使うことができません。

ここでは、RestTemplateを使ってgzip圧縮されたレスポンスを使用できるようにする方法を説明します。

レスポンスのサイズ

APIなどから受け取るレスポンスのサイズは、小さいに越したことはありません。 小さいと、

  • レスポンス全体の転送完了までの速度が上がる
  • 転送量が減るので、転送量ごとに料金がかかる場合、料金を削減することができる

などの利点があります。

転送量を減らすための方法はいくつかありますが、その一つに「データを圧縮してレスポンスを送信する」という方法があります。 例えば、Nginxでも設定によってレスポンスデータをgzip圧縮することができます。

ただし、RestTemplateを使っている場合、問題があります。 実は、デフォルトのRestTemplateではgzip圧縮されたレスポンスをそのまま使用することができないのです。 では、どうすれば良いのでしょうか。

RestTemplateでgzip圧縮されたレスポンスを使用する方法

gzip圧縮されたレスポンスを使用するには、RestTemplateの定義時に ClientHttpRequestFactory というものを設定する必要があります。

通常RestTemplateを定義する際は

var restTemplate = new RestTemplate();

とすると思いますが、これを

// バージョンは適宜変更してください
implementation 'org.apache.httpcomponents:httpclient:4.5.13'
var clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
var restTemplate = new RestTemplate(clientHttpRequestFactory);

のように、 ClientHttpRequestFactory を設定します。 後は、リクエスト時にヘッダーに Accept-Encodinggzipを設定すれば、(API側がgzip圧縮に対応していれば)gzip圧縮されたレスポンスを受け取り、自動で解凍して使ってくれるようになります。

最後に

デフォルトでgzip解凍をしてくれないというのは少し罠みたいなところもあり、詰まってしまった方もいるのではないでしょうか。 この記事が参考になれば幸いです。