Unirestのガイド

Unirestへのガイド

1. 概要

Unirestは、Mashapeの軽量HTTPクライアントライブラリです。 Javaに加えて、Node.js、.Net、Python、Rubyなどでも利用できます。

ジャンプする前に、ここではすべてのHTTPリクエストにmocky.ioを使用することに注意してください。

2. Mavenセットアップ

開始するには、最初に必要な依存関係を追加しましょう。


    com.mashape.unirest
    unirest-java
    1.4.9

最新バージョンhereをチェックしてください。

3. シンプルなリクエスト

フレームワークのセマンティクスを理解するために、簡単なHTTPリクエストを送信しましょう。

@Test
public void shouldReturnStatusOkay() {
    HttpResponse jsonResponse
      = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154")
      .header("accept", "application/json").queryString("apiKey", "123")
      .asJson();

    assertNotNull(jsonResponse.getBody());
    assertEquals(200, jsonResponse.getStatus());
}

APIは流fluentで効率的で、非常に読みやすいことに注意してください。

header()およびfields()APIを使用してヘッダーとパラメーターを渡します。

そして、リクエストはasJson()メソッド呼び出しで呼び出されます。ここには、asBinary(), asString()asObject().などの他のオプションもあります

複数のヘッダーまたはフィールドを渡すために、マップを作成して、それぞれ.headers(Map<String, Object> headers).fields(Map<String, String> fields)に渡すことができます。

@Test
public void shouldReturnStatusAccepted() {
    Map headers = new HashMap<>();
    headers.put("accept", "application/json");
    headers.put("Authorization", "Bearer 5a9ce37b3100004f00ab5154");

    Map fields = new HashMap<>();
    fields.put("name", "Sam example");
    fields.put("id", "PSP123");

    HttpResponse jsonResponse
      = Unirest.put("http://www.mocky.io/v2/5a9ce7853100002a00ab515e")
      .headers(headers).fields(fields)
      .asJson();

    assertNotNull(jsonResponse.getBody());
    assertEquals(202, jsonResponse.getStatus());
}

3.1. クエリパラメータの受け渡し

データをクエリString,として渡すには、queryString()メソッドを使用します。

HttpResponse jsonResponse
  = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154")
  .queryString("apiKey", "123")

3.2. パスパラメータの使用

URLパラメータを渡すために、routeParam()メソッドを使用できます。

HttpResponse jsonResponse
  = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}")
  .routeParam("userId", "123")

パラメーターのプレースホルダー名は、メソッドの最初の引数と同じである必要があります。

3.3. 本文付きのリクエスト

リクエストに文字列/ JSON本文が必要な場合は、body()メソッドを使用して渡します。

@Test
public void givenRequestBodyWhenCreatedThenCorrect() {

    HttpResponse jsonResponse
      = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
      .body("{\"name\":\"Sam example\", \"city\":\"viena\"}")
      .asJson();

    assertEquals(201, jsonResponse.getStatus());
}

3.4. オブジェクトマッパー

リクエストでasObject()またはbody()を使用するには、オブジェクトマッパーを定義する必要があります。 簡単にするために、Jacksonオブジェクトマッパーを使用します。

まず、次の依存関係をpom.xmlに追加しましょう。


    com.fasterxml.jackson.core
    jackson-databind
    2.9.4

常にon Maven Centralを超える最新バージョンを使用してください。

次に、マッパーを構成しましょう。

Unirest.setObjectMapper(new ObjectMapper() {
    com.fasterxml.jackson.databind.ObjectMapper mapper
      = new com.fasterxml.jackson.databind.ObjectMapper();

    public String writeValue(Object value) {
        return mapper.writeValueAsString(value);
    }

    public  T readValue(String value, Class valueType) {
        return mapper.readValue(value, valueType);
    }
});

マッパーを設定するために、setObjectMapper()は1回だけ呼び出す必要があることに注意してください。マッパーインスタンスが設定されると、すべての要求と応答に使用されます。

カスタムArticleオブジェクトを使用して新しい機能をテストしてみましょう。

@Test
public void givenArticleWhenCreatedThenCorrect() {
    Article article
      = new Article("ID1213", "Guide to Rest", "example");
    HttpResponse jsonResponse
      = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
      .body(article)
      .asJson();

    assertEquals(201, jsonResponse.getStatus());
}

4. リクエスト方法

HTTPクライアントと同様に、フレームワークはHTTP動詞ごとに個別のメソッドを提供します。

役職:

Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d")

PUT:

Unirest.put("http://www.mocky.io/v2/5a9ce7663100006800ab515d")

GET:

Unirest.get("http://www.mocky.io/v2/5a9ce7663100006800ab515d")

DELETE:

Unirest.delete("http://www.mocky.io/v2/5a9ce7663100006800ab515d")

パッチ:

Unirest.patch("http://www.mocky.io/v2/5a9ce7663100006800ab515d")

オプション:

Unirest.options("http://www.mocky.io/v2/5a9ce7663100006800ab515d")

5. 応答方法

応答を取得したら、ステータスコードとステータスメッセージを確認します。

//...
jsonResponse.getStatus()

//...

ヘッダーを抽出します。

//...
jsonResponse.getHeaders();
//...

応答本文を取得します。

//...
jsonResponse.getBody();
jsonResponse.getRawBody();
//...

getRawBody(),は未解析の応答本文のストリームを返すのに対し、getBody()は前のセクションで定義したオブジェクトマッパーを使用して解析済みの本文を返すことに注意してください。

6. 非同期リクエストの処理

Unirestには、java.util.concurrent.Futureとコールバックメソッドを使用して非同期リクエストを処理する機能もあります。

@Test
public void whenAysncRequestShouldReturnOk() {
    Future> future = Unirest.post(
      "http://www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms")
      .header("accept", "application/json")
      .asJsonAsync(new Callback() {

        public void failed(UnirestException e) {
            // Do something if the request failed
        }

        public void completed(HttpResponse response) {
            // Do something if the request is successful
        }

        public void cancelled() {
            // Do something if the request is cancelled
        }
        });

    assertEquals(200, future.get().getStatus());
}

com.mashape.unirest.http.async.Callback<T>インターフェースは、failed()cancelled()、およびcompleted().の3つのメソッドを提供します

応答に応じて、メソッドをオーバーライドして必要な操作を実行します。

7. ファイルのアップロード

リクエストの一部としてファイルをアップロードまたは送信するには、java.io.Fileオブジェクトをfileという名前のフィールドとして渡します。

@Test
public void givenFileWhenUploadedThenCorrect() {

    HttpResponse jsonResponse = Unirest.post(
      "http://www.mocky.io/v2/5a9ce7663100006800ab515d")
      .field("file", new File("/path/to/file"))
      .asJson();

    assertEquals(201, jsonResponse.getStatus());
}

ByteStream:も使用できます

@Test
public void givenByteStreamWhenUploadedThenCorrect() {
    try (InputStream inputStream = new FileInputStream(
      new File("/path/to/file/artcile.txt"))) {
        byte[] bytes = new byte[inputStream.available()];
        inputStream.read(bytes);
        HttpResponse jsonResponse = Unirest.post(
          "http://www.mocky.io/v2/5a9ce7663100006800ab515d")
          .field("file", bytes, "article.txt")
          .asJson();

        assertEquals(201, jsonResponse.getStatus());
    }
}

または、入力ストリームを直接使用して、fields()メソッドの2番目の引数としてContentType.APPLICATION_OCTET_STREAMを追加します。

@Test
public void givenInputStreamWhenUploadedThenCorrect() {
    try (InputStream inputStream = new FileInputStream(
      new File("/path/to/file/artcile.txt"))) {

        HttpResponse jsonResponse = Unirest.post(
          "http://www.mocky.io/v2/5a9ce7663100006800ab515d")
          .field("file", inputStream, ContentType.APPLICATION_OCTET_STREAM, "article.txt").asJson();

        assertEquals(201, jsonResponse.getStatus());
    }
}

8. ユニレスト構成

フレームワークは、接続プーリング、タイムアウト、グローバルヘッダーなどのHTTPクライアントの一般的な構成もサポートします。

ルートごとの接続数と最大接続数を設定しましょう。

Unirest.setConcurrency(20, 5);

接続とソケットのタイムアウトを構成します。

Unirest.setTimeouts(20000, 15000);

時間の値はミリ秒単位であることに注意してください。

それでは、すべてのリクエストにHTTPヘッダーを設定しましょう。

Unirest.setDefaultHeader("X-app-name", "example-unirest");
Unirest.setDefaultHeader("X-request-id", "100004f00ab5");

グローバルヘッダーはいつでもクリアできます。

Unirest.clearDefaultHeaders();

ある時点で、プロキシサーバーを介して要求を行う必要がある場合があります。

Unirest.setProxy(new HttpHost("localhost", 8080));

注意すべき重要な側面の1つは、アプリケーションを正常に終了または終了することです。 Unirestは、操作を処理するためにバックグラウンドイベントループを生成します。アプリケーションを終了する前に、そのループをシャットダウンする必要があります。

Unirest.shutdown();

9. 結論

このチュートリアルでは、軽量のHTTPクライアントフレームワークであるUnirestに注目しました。 同期モードと非同期モードの両方で、いくつかの簡単な例を使用しました。

最後に、接続プーリング、プロキシ設定など、いくつかの高度な構成も使用しました。

いつものように、ソースコードはover on GitHubで利用できます。