Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

OkHttpを初めて使ってみた話

More than 5 years have passed since last update.

この記事は私がOkHttpを初めて使った時の話をつらつらと書いていきます。
これを読んで「OkHttpを使ってみよう!」という気持ちになってくれたら幸いです。

OkHttpとは?

Square社(ゲーム会社ではありません)が管理しているオープンソースのライブラリです。
HTTP通信とSPDY通信をするためのクライアント用ライブラリです。
執筆時点での最新版は2.5.0かな。
ライセンスはApache License2.0です。

http://square.github.io/okhttp/

OkHttpを使おうと思った背景

ここ最近AndroidでHTTP通信をするアプリケーションを書いていたのですが、HTTP通信の部分の実装がめんどくさくて手間だったんです。この手間をなんとか軽減できるようなライブラリないかなー?って思って探して見つけたのがこれなんです。
(クックパッドさんなど他のサービスでもOkHttpを使って作業効率を上げている?みたいですし、気になっていたというのはあります。)

OkHttpを使うと得られる恩恵

http://square.github.io/okhttp/
のサイトを見る限りだと、

・HTTP/2 and SPDY support allows all requests to the same host to share a socket.
・Connection pooling reduces request latency (if SPDY isn’t available).
・Transparent GZIP shrinks download sizes.
・Response caching avoids the network completely for repeat requests.

と書いてありますが…私が思う一番のメリットは
「HttpURLConnectionを使うやり方と比べて、スマートにコーディングすることができる」
ということです。

実際、HttpURLConnectionの場合・OkHttpの場合とで比較するとソースコードの短さ・ネストの深さ的にOkHttpの方がスマートだと言えますよね。

HttpURLConnectionの場合
    private String getHttpUrlConnection() throws IOException{
        String xml = null;
        HttpURLConnection conn = null;
        try {
            URL url = new URL("http://zip.cgis.biz/xml/zip.php?zn=1700011");
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);

            conn.connect();

            if (conn.getResponseCode() == 200) {
                InputStream is = conn.getInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] bytes = new byte[256];
                int len = 0;
                while ((len = is.read(bytes, 0, 256)) != -1) {
                    baos.write(bytes, 0, len);
                }
                xml = new String(baos.toByteArray(), "UTF-8");
            }
        } finally {
            if (conn != null)
                conn.disconnect();
        }
        return xml;
    }
OkHttpの場合
    private String getByOkHttp() throws IOException {
        Request request = new Request.Builder()
                .url("http://zip.cgis.biz/xml/zip.php?zn=1700011")
                .get()
                .build();

        OkHttpClient client = new OkHttpClient();

        Response response = client.newCall(request).execute();
        return response.body().string();
    }

※このコードで使っているURLは「郵便番号検索API」を参照しました。

導入手順

私がAndroidStudioを使って導入した手順を記載いたします。
(Eclipse・jarを使ってやることもできますので安心してくだい。)

  1. AndroidStudioのプロジェクトを開き、[app]フォルダ内のbuild.gradleを開きます。

  2. build.gradleのdependenciesブロック内に以下のコードを追記します。(2.5.0でないバージョンを使いたい場合は、2.5.0のところを別のバージョンに置き換えてください)
    compile 'com.squareup.okhttp:okhttp:2.5.0'

3.「Sync Now」をクリック。

この手順を踏めばあとは上記「OkHttpの場合」のようなコードを書くことができます。
具体的な書き方については、
http://qiita.com/ryugoo/items/478ba23cda0f57bd21e8
を参考にしてください。

使ってみてどうでした?

だいぶスマートに楽にかけるようになりました。(それが上記のコード)
これにつきます!

上記コードではレスポンスコードによる処理の分岐とかきちんと書いていないのですが、Response#code()メソッドで取れるみたいなのでこれをうまく使えばエラー処理も込みでスマートに書くことができそうです。

デメリットってないの?

調べて見る限り特記すべきデメリットはなかったように思えます。
強いて言うなら、アプリのサイズがでかくなるとかそんなものでしょうか。

まとめ

OkHttpを使えば従来のHttpURLConnectionによるやり方よりずっとスマートに素早くコードを書くことができます!
もし「おお!使ってみたい!」と思ってみたらすぐに試してみましょう。
あなたが抱えているプロジェクトに使えそうならみんなに提案してみましょう。

LyricalMaestro0
よろしくお願いいたします。 ・GooglePlayにアプリをリリースしています。 https://play.google.com/store/apps/developer?id=Maestro_L_jp&hl=ja
http://lyricalmaestrojp.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away