Google-Http-Clientガイド
1概要
この記事では、https://developers.google.com/api-client-library/java/google-http-java-client/[Google用Google HTTPクライアントライブラリ]を見てみましょう。 HTTP接続プロトコルを介してあらゆるリソースにアクセスするための高速で抽象化されたライブラリ。
クライアントの主な機能は次のとおりです。
-
低レベルのライブラリを切り離すことができるHTTP抽象化レイヤ
-
HTTPの高速で効率的かつ柔軟なJSONおよびXML解析モデル
レスポンスとリクエストの内容
** HTTPリソースマッピング用の使いやすいアノテーションと抽象化
このライブラリはJava 5以降でも使用できるため、従来の(SEおよびEE)プロジェクトにはかなりの選択肢となります。
この記事では、ライブラリの最も興味深い機能をいくつかカバーしながら、GitHub APIに接続してユーザーを取得する簡単なアプリケーションを開発します。
2 Mavenの依存関係
このライブラリを使用するには、
google-http-client
依存関係が必要です。
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.23.0</version>
</dependency>
最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cgoogle-http-client[Maven Central]にあります。
3.簡単なリクエストをする
まず、GitHubページに簡単なGETリクエストを送信して、Google Http Clientがそのまま動作する様子を紹介しましょう。
HttpRequestFactory requestFactory
= new NetHttpTransport().createRequestFactory();
HttpRequest request = requestFactory.buildGetRequest(
new GenericUrl("https://github.com"));
String rawResponse = request.execute().parseAsString()
リクエストを最も簡単にするには、少なくとも次のものが必要です。
-
HttpRequestFactory
これはリクエストを構築するために使用されます -
HttpTransport
– 低レベルのHTTPトランスポート層の抽象化 -
GenericUrl
はUrlをラップするクラスです -
HttpRequest
はリクエストの実際の実行を処理します。
次のセクションでは、これらすべてと、JSON形式を返す実際のAPIを使用したより複雑な例について説明します。
4プラガブルHTTP転送
このライブラリには抽象化された
HttpTransport
クラスがあり、その上に構築して、
基礎となる低レベルのHTTPトランスポートライブラリの選択
に変更できます。
public class GitHubExample {
static HttpTransport HTTP__TRANSPORT = new NetHttpTransport();
}
この例では、すべてのJava SDKにある
HttpURLConnection
に基づいた
NetHttpTransport
を使用しています。これはよく知られており信頼性があるので、これは良い選択です。
もちろん、高度なカスタマイズが必要な場合もあります。そのため、より複雑な低レベルライブラリが必要になります。
このような場合には、__ApacheHttpTransportがあります。
public class GitHubExample {
static HttpTransport HTTP__TRANSPORT = new ApacheHttpTransport();
}
ApacheHttpTransport
は、一般的なhttp://hc.apache.org/httpcomponents-client-ga/index.html[Apache HttpClient]に基づいており、接続を構成するためのさまざまな選択肢が含まれています。
さらに、ライブラリには、低レベルの実装を構築するためのオプションが用意されているため、非常に柔軟です。
5 JSON解析
Google Http Clientには、JSON解析のための別の抽象概念が含まれています。これの主な利点は、低レベル解析ライブラリの選択が交換可能であることです。
3つの組み込みの選択肢があり、そのすべてが__JsonFactoryを拡張しています。また、独自の実装の可能性も含まれています。
5.1. 交換可能な解析ライブラリ
私たちの例では、私たちはJackson2実装を使うつもりです。
google-http-client-jackson2
]依存関係:
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.23.0</version>
</dependency>
これに続いて、__JsonFactoryを含めることができます。
public class GitHubExample {
static HttpTransport HTTP__TRANSPORT = new NetHttpTransport();
staticJsonFactory JSON__FACTORY = new JacksonFactory();
}
JacksonFactory
は、解析/直列化操作のための最速かつ最も人気のあるライブラリです。
これはライブラリのサイズを犠牲にして発生します(これは特定の状況では問題になる可能性があります)。このため、Googleでは
GsonFactory
も提供しています。これは、軽量のJSON構文解析ライブラリであるGoogle GSONライブラリの実装です。
低レベルのパーサー実装を書く可能性もあります。
5.2. @
Key
アノテーション
@ Key
アノテーションを使用して、JSONから解析またはシリアル化する必要があるフィールドを指定できます。
public class User {
@Key
private String login;
@Key
private long id;
@Key("email")
private String email;
//standard getters and setters
}
ここでは
User
抽象化を作成しています。これはGitHub APIからバッチで受け取ります(この記事の後半で実際の解析に移ります)。
@ Key
アノテーションを付けていない
フィールドは内部と見なされ、JSON
から解析またはシリアライズされません。
また、フィールドの可視性は問題ではなく、getterメソッドまたはsetterメソッドの存在も重要ではありません。
@ Key
アノテーションの値を指定して、正しいJSONキーにマッピングすることができます。
5.3.
一般Json
宣言し、
@ Key
としてマークしたフィールドのみが解析されます。
他のコンテンツを保持するために、__GenericJsonを拡張するようにクラスを宣言できます。
public class User extends GenericJson {
//...
}
GenericJson
は
Map
インターフェースを実装しています。つまり、getおよびputメソッドを使用して、リクエスト/レスポンス内のJSONコンテンツを設定/取得することができます。
6. 電話をかける
Google Httpクライアントでエンドポイントに接続するには、
HttpRequestFactory
が必要です。これは、以前の抽象化
HttpTransport
と__JsonFactoryで構成されます。
public class GitHubExample {
static HttpTransport HTTP__TRANSPORT = new NetHttpTransport();
static JsonFactory JSON__FACTORY = new JacksonFactory();
private static void run() throws Exception {
HttpRequestFactory requestFactory
= HTTP__TRANSPORT.createRequestFactory(
(HttpRequest request) -> {
request.setParser(new JsonObjectParser(JSON__FACTORY));
});
}
}
次に必要となるのは、接続先のURLです。ライブラリはこれを
GenericUrl
を拡張するクラスとして扱い、宣言されたフィールドはクエリパラメータとして扱われます。
public class GitHubUrl extends GenericUrl {
public GitHubUrl(String encodedUrl) {
super(encodedUrl);
}
@Key
public int per__page;
}
ここでの
GitHubUrlでは、
per
page
プロパティを宣言して、GitHub APIへの1回の呼び出しで必要なユーザー数を示します。
__GitHubUrlを使用して引き続き電話をかけましょう。
private static void run() throws Exception {
HttpRequestFactory requestFactory
= HTTP__TRANSPORT.createRequestFactory(
(HttpRequest request) -> {
request.setParser(new JsonObjectParser(JSON__FACTORY));
});
GitHubUrl url = new GitHubUrl("https://api.github.com/users");
url.per__page = 10;
HttpRequest request = requestFactory.buildGetRequest(url);
Type type = new TypeToken<List<User>>() {}.getType();
List<User> users = (List<User>)request
.execute()
.parseAs(type);
}
API呼び出しに必要なユーザー数を指定した後、
HttpRequestFactory
を使用してリクエストを作成します。
これに続いて、GitHub APIのレスポンスにはユーザーのリストが含まれているので、複雑な
Type
を提供する必要があります。これは
List <User>
です。
次に、最後の行で、呼び出しを行い、
User
クラスのリストに対する応答を解析します。
7.カスタムヘッダ
APIリクエストを行うときに私たちが通常する1つのことは、ある種のカスタムヘッダー、あるいは変更されたものを含めることです。
HttpHeaders headers = request.getHeaders();
headers.setUserAgent("Baeldung Client");
headers.set("Time-Zone", "Europe/Amsterdam");
リクエストを作成した後、それを実行して必要な値を追加する前に、
HttpHeaders
を取得します。
Google Http Clientには、特別なメソッドとしていくつかのヘッダが含まれていることに注意してください。
8指数バックオフ
Google HTTPクライアントのもう1つの重要な機能は、特定のステータスコードとしきい値に基づいてリクエストを再試行できることです。
リクエストオブジェクトを作成した直後に指数バックオフ設定を含めることができます。
ExponentialBackOff backoff = new ExponentialBackOff.Builder()
.setInitialIntervalMillis(500)
.setMaxElapsedTimeMillis(900000)
.setMaxIntervalMillis(6000)
.setMultiplier(1.5)
.setRandomizationFactor(0.5)
.build();
request.setUnsuccessfulResponseHandler(
new HttpBackOffUnsuccessfulResponseHandler(backoff));
-
Exponential Backoffは
HttpRequest
** ではデフォルトでオフになっているため、アクティブにするには
HttpUnsuccessfulResponseHandler
のインスタンスを
HttpRequest
に含める必要があります。
9ロギング
Google Http Clientは、URLの要求、応答の詳細(URL、ヘッダー、コンテンツなど)の記録に
java.util.logging.Logger
を使用します。
通常、ロギングは
logging.properties
ファイルを使用して管理されます。
handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = ALL
com.google.api.client.http.level = ALL
この例では
ConsoleHandler
を使用していますが、
FileHandler
を選択することもできます。
プロパティファイルは、JDKロギング機能の動作を設定します。この設定ファイルはシステムプロパティとして指定できます。
-Djava.util.logging.config.file=logging.properties
そのため、ファイルとシステムプロパティを設定すると、ライブラリは次のようなログを作成します。
-------------- REQUEST --------------
GET https://api.github.com/users?page=1&per__page=10
Accept-Encoding: gzip
User-Agent: Google-HTTP-Java-Client/1.23.0 (gzip)
Nov 12, 2017 6:43:15 PM com.google.api.client.http.HttpRequest execute
curl -v --compressed -H 'Accept-Encoding: gzip' -H 'User-Agent: Google-HTTP-Java-Client/1.23.0 (gzip)' -- 'https://api.github.com/users?page=1&per__page=10'
Nov 12, 2017 6:43:16 PM com.google.api.client.http.HttpResponse
-------------- RESPONSE --------------
HTTP/1.1 200 OK
Status: 200 OK
Transfer-Encoding: chunked
Server: GitHub.com
Access-Control-Allow-Origin: **
...
Link: <https://api.github.com/users?page=1&per__page=10&since=19>; rel="next", <https://api.github.com/users{?since}>; rel="first"
X-GitHub-Request-Id: 8D6A:1B54F:3377D97:3E37B36:5A08DC93
Content-Type: application/json; charset=utf-8
...
10結論
このチュートリアルでは、Java用Google HTTPクライアントライブラリとその便利な機能を紹介しました。彼らのhttps://github.com/google/google-http-java-client[Github]には、それに関する詳細とライブラリのソースコードが含まれています。
いつものように、このチュートリアルの完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries[over GitHub]から入手可能です。