ユニレストへのガイド
1. 概要
Unirestは、Mashapeの軽量HTTPクライアントライブラリです。 Javaに加えて、Node.js、.Net、Python、Rubyなどでも利用できます。
ジャンプする前に、ここではすべてのHTTPリクエストにmocky.ioを使用することに注意してください。
2. Mavenのセットアップ
開始するには、最初に必要な依存関係を追加しましょう。
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.9</version>
</dependency>
最新バージョンこちらをご覧ください。
3. 簡単なリクエスト
フレームワークのセマンティクスを理解するために、簡単なHTTPリクエストを送信してみましょう。
@Test
public void shouldReturnStatusOkay() {
HttpResponse<JsonNode> 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は流暢で効率的で、非常に読みやすいことに注意してください。
header()および fields()APIを使用してヘッダーとパラメーターを渡します。
そして、リクエストは asJson()メソッド呼び出しで呼び出されます。 ここには、 asBinary()、asString()、 asObject()。などの他のオプションもあります。
複数のヘッダーまたはフィールドを渡すために、マップを作成してそれらをに渡すことができます .headers(マップ
@Test
public void shouldReturnStatusAccepted() {
Map<String, String> headers = new HashMap<>();
headers.put("accept", "application/json");
headers.put("Authorization", "Bearer 5a9ce37b3100004f00ab5154");
Map<String, Object> fields = new HashMap<>();
fields.put("name", "Sam Baeldung");
fields.put("id", "PSP123");
HttpResponse<JsonNode> 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<JsonNode> jsonResponse
= Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154")
.queryString("apiKey", "123")
3.2. パスパラメータの使用
URLパラメータを渡すために、 routeParam()メソッドを使用できます。
HttpResponse<JsonNode> jsonResponse
= Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}")
.routeParam("userId", "123")
パラメーターのプレースホルダー名は、メソッドの最初の引数と同じである必要があります。
3.3. ボディ付きリクエスト
リクエストに文字列/JSON本文が必要な場合は、 body()メソッドを使用して渡します。
@Test
public void givenRequestBodyWhenCreatedThenCorrect() {
HttpResponse<JsonNode> jsonResponse
= Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
.body("{\"name\":\"Sam Baeldung\", \"city\":\"viena\"}")
.asJson();
assertEquals(201, jsonResponse.getStatus());
}
3.4. オブジェクトマッパー
リクエストでasObject()または body()を使用するには、オブジェクトマッパーを定義する必要があります。 簡単にするために、Jacksonオブジェクトマッパーを使用します。
まず、次の依存関係をpom.xmlに追加しましょう。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
MavenCentralでは常によりも最新バージョンを使用してください。
次に、マッパーを構成しましょう。
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> T readValue(String value, Class<T> valueType) {
return mapper.readValue(value, valueType);
}
});
setObjectMapper()は、マッパーを設定するために1回だけ呼び出す必要があることに注意してください。 マッパーインスタンスが設定されると、すべての要求と応答に使用されます。
カスタムArticleオブジェクトを使用して新しい機能をテストしてみましょう。
@Test
public void givenArticleWhenCreatedThenCorrect() {
Article article
= new Article("ID1213", "Guide to Rest", "baeldung");
HttpResponse<JsonNode> 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")
置く:
Unirest.put("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
得る:
Unirest.get("http://www.mocky.io/v2/5a9ce7663100006800ab515d")
消去:
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<HttpResponse<JsonNode>> future = Unirest.post(
"http://www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms")
.header("accept", "application/json")
.asJsonAsync(new Callback<JsonNode>() {
public void failed(UnirestException e) {
// Do something if the request failed
}
public void completed(HttpResponse<JsonNode> response) {
// Do something if the request is successful
}
public void cancelled() {
// Do something if the request is cancelled
}
});
assertEquals(200, future.get().getStatus());
}
The com.mashape.unirest.http.async.Callback
メソッドをオーバーライドして、応答に応じて必要な操作を実行します。
7. ファイルのアップロード
リクエストの一部としてファイルをアップロードまたは送信するには、java.io.Fileオブジェクトをfileという名前のフィールドとして渡します。
@Test
public void givenFileWhenUploadedThenCorrect() {
HttpResponse<JsonNode> 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<JsonNode> jsonResponse = Unirest.post(
"http://www.mocky.io/v2/5a9ce7663100006800ab515d")
.field("file", bytes, "article.txt")
.asJson();
assertEquals(201, jsonResponse.getStatus());
}
}
または、入力ストリームを直接使用して、 ContentType.APPLICATION_OCTET_STREAMをfields()メソッドの2番目の引数として追加します。
@Test
public void givenInputStreamWhenUploadedThenCorrect() {
try (InputStream inputStream = new FileInputStream(
new File("/path/to/file/artcile.txt"))) {
HttpResponse<JsonNode> 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", "baeldung-unirest");
Unirest.setDefaultHeader("X-request-id", "100004f00ab5");
グローバルヘッダーはいつでもクリアできます。
Unirest.clearDefaultHeaders();
ある時点で、プロキシサーバーを介してリクエストを行う必要があるかもしれません。
Unirest.setProxy(new HttpHost("localhost", 8080));
注意すべき重要な側面の1つは、アプリケーションを正常に閉じるか終了することです。 Unirestは、操作を処理するためにバックグラウンドイベントループを生成します。アプリケーションを終了する前に、そのループをシャットダウンする必要があります。
Unirest.shutdown();
9. 結論
このチュートリアルでは、軽量のHTTPクライアントフレームワークであるUnirestに焦点を当てました。 同期モードと非同期モードの両方で、いくつかの簡単な例を使用しました。
最後に、接続プール、プロキシ設定など、いくつかの高度な構成も使用しました。
いつものように、ソースコードはGitHubでから入手できます。