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

