こんにちは。 エキサイト株式会社の三浦です。
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-Encoding
でgzipを設定すれば、(API側がgzip圧縮に対応していれば)gzip圧縮されたレスポンスを受け取り、自動で解凍して使ってくれるようになります。
最後に
デフォルトでgzip解凍をしてくれないというのは少し罠みたいなところもあり、詰まってしまった方もいるのではないでしょうか。 この記事が参考になれば幸いです。