【Java】Google Http Clientライブラリの使い方

google-http-java-client

抽象化することで低層のライブラリに依存することなく、統一的な操作がHttp操作が可能です。

https://github.com/googleapis/google-http-java-client

使用時にすることは使用したい環境・低層ライブラリに応じた具象HttpTransportの選択と、json/xml parserの選択です。

HttpTransport

使用指針はこちらに記載されていますので、これに則ります。

https://cloud.google.com/java/docs/reference/google-http-client/latest/com.google.api.client.http.HttpTransport

選択肢としては以下があります。

UrlFetchTransport Google App Engine用
ApacheHttpTransport Apache Http Clientを低層ライブラリとしたクラス。Apache Http Clientに使用可能なConfigurationを設定したい場合に使用。
NetHttpTransport JavaネイティブのHttpUrlConnectionを低層ライブラリとしたクラス。 *HttpUrlConnectionなのでjava8以前でも使用可能だが、Http/2やWebSocketには対応していないはず。将来的にはJava11以降で導入されたHttpClientを低層ライブラリとした新しいクラスができるのでは?
AndroidHttp #newCompatibleTransport Androidの互換性を判断して正しいTransportを返します。実態はApacheHttpTransportかNetHttpTransport.

調べた感じでは、Transportは全体的にHttp/2には対応していない様子。ApacheHttpTransportでもHttp/1.1であることが求められている。

とりあえず試しで使用したいのであればNetHttpTransportがよい。

json parser

これはdeprecatedで示されているので分かりやすいですが、GsonFactoryを用いてjson parserを取得します。

GsonFactory#createJsonObjectParser() こちらを使用
JacksonFactory# createJsonObjectParser() deprecated

導入

Gradle

compile 'com.google.http-client:google-http-client:[VERSION]'

https://googleapis.github.io/google-http-java-client/setup.html

使い方

HttpTransportやJsonFactoryはシングルトンであることが求められているため、そのような実装にします。(例では単にスタティック変数にしているだけですが)

private static NetHttpTransport transport = new NetHttpTransport();
private static HttpRequestFactory factory = transport.createRequestFactory(new HttpRequestInitializer() {
    public void initialize(final HttpRequest request) throws IOException {
        request.setConnectTimeout(0);
        request.setReadTimeout(0);
        request.setParser(gsonFactory.createJsonObjectParser());
    }
});
private static GsonFactory gsonFactory = new GsonFactory();
private String requestByUrl(String url) throws IOException {
    String jsonString = null;
    HttpResponse response = null;
    try {
        HttpRequest request = factory.buildGetRequest(new GenericUrl(url));
        response = request.execute();
        jsonString = response.parseAsString();
    } catch (HttpResponseException e){
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        jsonString = null;
    } finally {
        response.disconnect();  //これは呼んでおいた方が無難。
    }
    return jsonString;
}

HttpRequest#execute()の例外時にHttpResponseExceptionが投げられるので、処理する必要があります。また、HttpResponse#parseAsStringでcontentをparseできますが、この際に例外が発生するとIOExceptionが投げられるので、これも処理します。

以下に少ないですがsetup方法が書いてあります。

https://googleapis.github.io/google-http-java-client/http-transport.html

Requestの作成方法は共通で、factory#buildXxxRequest()を用いてGet, Post, Delete, Put等を作成します。また、URLにはGenericUrlクラスを使用します。

Http Clientライブラリ

そもそもHttp Clientって何があるのか、google http clientを調査中に調べていて気になったので調査しました。

HttpUrlConnection Java bundleのhttp client。 Androidのページだけど使い方等は以下が分かりやすい。 https://developer.android.com/reference/java/net/HttpURLConnection
HttpClient Java bundleのJava11以降で使用可能なclient。HTTP/2やWebSocketに対応。 https://openjdk.org/groups/net/httpclient/
ApacheHttpClient 古株で頻繁にアップデートも実施されている。https://hc.apache.org/httpcomponents-client-5.1.x/
OkHttp 最もメジャー? https://square.github.io/okhttp/
Retrofit android志向。OkHttpを主な低層ライブラリとしてラップしてFacade化、及びより上位の機能を提供するライブラリ。 https://square.github.io/retrofit/
Volley android志向。特に早さを重視しているらしいが・・? https://google.github.io/volley/

以下のページが比較としては分かりやすかったです。どこまで本当なのか試せていませんが。またいつかどれが本当にいいのか試したいところ・・。

https://www.mocklab.io/blog/which-java-http-client-should-i-use-in-2020/