google-http-java-client
抽象化することで低層のライブラリに依存することなく、統一的な操作がHttp操作が可能です。
使用時にすることは使用したい環境・低層ライブラリに応じた具象HttpTransportの選択と、json/xml parserの選択です。
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]'
使い方
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方法が書いてあります。
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/ |
以下のページが比較としては分かりやすかったです。どこまで本当なのか試せていませんが。またいつかどれが本当にいいのか試したいところ・・。