CLOVER🍀

That was when it all began.

OkHttpを試す

JavaでのHTTPクライアントを使う時、最近はJAX-RS Cientに流れていたのですが標準ではまだやれないことがあったりすることがわかり、ちょっと気になっていたOkHttpも触ってみることにしました。

OkHttp

個人的に書いていた、以下のシリーズの続き的な感じでやってみます。

JavaでのHttpClientサンプル - CLOVER

JavaでのHttpClientサンプル その2 - CLOVER

OkHttpを使いつつ、上記のエントリとほぼ同じように

といった流れでやっていきたいと思います。

準備

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を参考にして。

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

ちょっとずつ、今後活用してみたいと思います。

参考)
OkHttp 2.0 を使ってみた

OkHttpを初めて使ってみた話

OkHttpを使う - tumblr

OkHttpを使ってHTTP/2で通信する + おまけ · matsumanaの技術メモ