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]から入手可能です。