スポンサーリンク

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

スポンサーリンク

google-http-java-client

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

GitHub - googleapis/google-http-java-client: Google HTTP Client Library for Java
Google HTTP Client Library for Java. Contribute to googleapis/google-http-java-client development by creating an account on GitHub.

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

HttpTransport

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

Class HttpTransport (1.44.2)  |  Java client library  |  Google Cloud

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

UrlFetchTransportGoogle App Engine用
ApacheHttpTransportApache Http Clientを低層ライブラリとしたクラス。Apache Http Clientに使用可能なConfigurationを設定したい場合に使用。
NetHttpTransportJavaネイティブの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]' 
Setup Instructions
Google HTTP Client Library for Java

使い方

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方法が書いてあります。

Pluggable HTTP Transport
Google HTTP Client Library for Java

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

Http Clientライブラリ

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

HttpUrlConnectionJava bundleのhttp client。
Androidのページだけど使い方等は以下が分かりやすい。
https://developer.android.com/reference/java/net/HttpURLConnection
HttpClientJava 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/

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

Which Java HTTP client should I use in 2023?
HTTP has become the dominant protocol for integration of networked programs, and consequently many (possibly most) Java projects need to be able to make HTTP ca...
タイトルとURLをコピーしました