JavaでのHTTPクライアントを使う時、最近はJAX-RS Cientに流れていたのですが標準ではまだやれないことがあったりすることがわかり、ちょっと気になっていたOkHttpも触ってみることにしました。
個人的に書いていた、以下のシリーズの続き的な感じでやってみます。
JavaでのHttpClientサンプル その2 - CLOVER
OkHttpを使いつつ、上記のエントリとほぼ同じように
- 簡単なGET/POSTを行う
- HTTPステータスコードが200かどうか判定する
- レスポンスはJUnit/AssertJで検証する
といった流れでやっていきたいと思います。
準備
Maven依存関係。
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.3.0</version> <scope>test</scope> </dependency>
JUnit、AssertJはテストコード用です。
また、テストで使うHTTPサーバーは、以下のような挙動をするものとします。
## GET $ curl http://localhost:8080/get?param=value Accessed URL = /get?param=value Accessed Method = GET Accessed Date = Sat Feb 27 17:44:35 JST 2016 ## POST $ curl -X POST http://localhost:8080/post -d '<<EOF > POST BODY > Hello Http Server!! > EOF > ' Accessed URL = /post Accessed Method = POST Accessed Date = Sat Feb 27 17:44:48 JST 2016 Request Body<< <<EOF POST BODY Hello Http Server!! EOF >>
これと同じ事を、OkHttpを使ってやっていきます。
Examplesを参考にして。
テストコードの雛形
以降のコードは、下記のテストクラス内で書かれているものとします。
src/test/java/org/littlewings/okhttp/OkHttpTest.java
package org.littlewings.okhttp; import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; public class OkHttpTest { // ここに、テストを書く! }
GET/POSTの例
それでは、コードを書いていきます。
まずはGETの例。
@Test public void getGettingStarted() throws IOException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://localhost:8080/get?param=value") .build(); Response response = client.newCall(request).execute(); assertThat(response.code()) .isEqualTo(200); assertThat(response.isSuccessful()) .isTrue(); assertThat(response.body().string()) .contains("Accessed URL = /get?param=value", "Accessed Method = GET"); response.body().close(); }
OkHttpClientを作成し、Request.Builderでリクエストの内容を組み立て、OkHttpClient#newCall → executeで実行するスタイルみたいです。
簡単でよいですね!
クローズについての話は、Response#body#closeでよさそうです。
response.body().close();
続いて、POSTの例。
@Test public void postGettingStarted() throws IOException { OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(MediaType.parse("text/plain"), new StringBuilder().append("POST Body").append("\r\n").append("Hello Http Server!!").append("\r\n").toString() ); Request request = new Request.Builder() .url("http://localhost:8080/post") .post(body) .build(); Response response = client.newCall(request).execute(); assertThat(response.code()) .isEqualTo(200); assertThat(response.isSuccessful()) .isTrue(); assertThat(response.body().string()) .contains("Accessed URL = /post", "Accessed Method = POST", "Request Body<<", "POST Body", "Hello Http Server!!", ">>"); response.body().close(); }
こちらは、Request.Builderで送信するBody部を組み立てればよいみたいです。
まとめ
OkHttpを試してみましたが、思った以上に簡単で便利そうです。
依存ライブラリも少なく、okioというライブラリのみみたいですね。
https://github.com/square/okio
Wiki上に、
Home · square/okhttp Wiki · GitHub
それなりにたくさんのレシピもあるので、普通に使う分には困らなさそうな雰囲気。
https://github.com/square/okhttp/wiki/Recipes
ちょっとずつ、今後活用してみたいと思います。