schedule2018-12-20

OkHttp3を使ったJSONのPOST送信の方法。Mavenの書き方も追加

前の記事JavaからJSON文字列をPOSTで送信するでは標準ライブラリを使って実現していました。 しかし、コードが長くなり見通しが悪いです。

今回はライブラリのOkHttp3を使用して、より簡潔に書くことを目指します。


※2018-12-20 この記事ははてなブログから引っ越しました。 ※2019-04-02 最新のバージョンで試し記事をリライトしました。

OkHttpについて

OkHttpの公式サイト

OkHttpはデフォルトで効率的なHTTPクライアントです。 書き方が簡潔になる他にも有用です。

  • HTTP/2サポートにより、同じホストへのすべての要求がソケットを共有できる。
  • (HTTP/2が利用できない場合)コネクションプーリングはリクエストの待ち時間を短縮する。
  • Transparent GZIPはダウンロードサイズを縮小する。
  • 応答キャッシングは、繰り返し要求に対してネットワークを完全に回避する。

OkHttp supports

  • Android 5.0+ (API level 21+)
  • Java 8+.

ライセンス

Apache License 2.0です。

必要なファイル

この記事で使用したバージョンのJar。

  • okhttp-3.14.0.jar
  • okio-2.2.2.jar

Jarの追加方法

okhttp.jar公式サイトからダウンロードできます。

download

okio.jarokhttp3.OkHttpClientを実行するときに必要になります。 okhttp.jarと同じくビルドパスを通してください。

Mavenでの追加方法

pom.xml<dependencies>に以下を追加してください。

  <dependencies>

+   <dependency>
+     <groupId>com.squareup.okhttp3</groupId>
+     <artifactId>okhttp</artifactId>
+     <version>3.14.0</version>
+   </dependency>
+   <dependency>
+     <groupId>com.squareup.okio</groupId>
+     <artifactId>okio</artifactId>
+     <version>2.2.2</version>
+   </dependency>
  </dependencies>

コード

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttpJson {
	public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

	OkHttpClient client = new OkHttpClient();

	String post(String url, String json) throws IOException {
		RequestBody body = RequestBody.create(JSON, json);
		Request request = new Request.Builder()
			.url(url)
			.post(body)
			.build();
		try (Response response = client.newCall(request).execute()) {
			return response.body().string();
		}
	}

	public static void main(String[] args) throws IOException {
		
		String url = "http://{hostname}/api/login/";
		String json = "{\"account\":\"hoge\", \"pass\":\"piyo\"}";

		OkHttpJson okHttpJson = new OkHttpJson();
		String response = okHttpJson.post(url, json);
		System.out.println(response);
	}
}

標準ライブラリの3分の1程の行数で書くことができました! 短いとメンテナンスが楽になりますね。

MediaType.get()の書き方が少し変わっていました。

おわりに

VSCodeでJavaの開発環境を構築する方法をまとめました。


書籍紹介

新入社員として初めてJavaとサーブレットを勉強していた時、この3冊に大変お世話になりました。 仕事で使う技術の基礎が体系的にまとまっていています。 まずはこの3冊の中でわからないところを読み込んだり調べたりして学べば、成長できるのではと思います。