[Kotlin] OkHttp3の使い方 | GETとPOSTリクエスト

Android

Androidアプリで通信処理を作る方法はいくつかあります。
今回はそのうちの一つであるOkHttpを使った方法を簡単にではありますがまとめていきます。
特に、頻繁に使われるHTTPメソッドのGETPOSTのサンプルコードを載せていきます。

Overview - OkHttp
Square’s meticulous HTTP client for the JVM, Android, and GraalVM
スポンサーリンク

環境

  • Android Studio : 4.1.1
  • Kotlin : 1.3.72-release-Studio4.1-5
  • OkHttp3 : 4.9.0

事前準備

gradleにOkHttp3のライブラリの依存を追加します。

dependencies {
    // OkHttp3
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}

GETリクエスト

GETリクエストのサンプルコードは以下です。

// OkHttpClientを作成
private val client = OkHttpClient.Builder()
        .connectTimeout(CONNECTION_TIMEOUT_MILLISECONDS.toLong(), TimeUnit.MILLISECONDS)
        .readTimeout(READ_TIMEOUT_MILLISECONDS.toLong(), TimeUnit.MILLISECONDS)
        .build()

override fun startGetRequest() {
    // Requestを作成
    val request = Request.Builder()
        .url("ここにURL")
        .build()

    client.newCall(request).enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response) {
            // Responseの読み出し
            val responseBody = response.body?.string().orEmpty()
            // 必要に応じてCallback
        }

        override fun onFailure(call: Call, e: IOException) {
            Log.e("Error", e.toString())
            // 必要に応じてCallback
        }
    })
}

POSTリクエスト

POSTリクエストのサンプルコードは以下です。

// OkHttpClientを作成
private val client = OkHttpClient.Builder()
        .connectTimeout(CONNECTION_TIMEOUT_MILLISECONDS.toLong(), TimeUnit.MILLISECONDS)
        .readTimeout(READ_TIMEOUT_MILLISECONDS.toLong(), TimeUnit.MILLISECONDS)
        .build()

private val JSON_MEDIA = "application/json; charset=utf-8".toMediaType()

override fun startPostRequest() {
    // Bodyのデータ(サンプル)
    val sendDataJson = "{\"id\":\"1234567890\",\"name\":\"hogehoge\"}"

    // Requestを作成
    val request = Request.Builder()
        .url(urlStr)
        .post(sendDataJson.toRequestBody(JSON_MEDIA))
        .build()

    client.newCall(request).enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response) {
            // Responseの読み出し
            val responseBody = response.body?.string().orEmpty()
            // 必要に応じてCallback
        }

        override fun onFailure(call: Call, e: IOException) {
            Log.e("Error", e.toString())
            // 必要に応じてCallback
        }
    })
}

サンプルコードの補足

GET/POSTリクエストのサンプルコードの補足をします。
ます、GET/POSTに関わらず以下の順番で通信処理を開始します。

  1. OkHttpClientを作成
  2. Requestを作成
  3. OkHttpClientで作成したRequestで通信処理を実行

その他補足情報

今回、通信処理を行うため、まずAndroidManifest.xmlにインターネットへの接続許可を追加する必要があります。

<uses-permission android:name="android.permission.INTERNET" />

また、サンプルではenqueue()でコールバックを設定して非同期で実行していました。
しかし、execute()を使うことで同期で実行することも可能です。

val response = client.newCall(request).execute()
val responseBody = response.body?.string().orEmpty()

だたし、この場合はワーカースレッドで実行する必要があります
通信処理をメインスレッドで実行するとandroid.os.NetworkOnMainThreadExceptionエラーが発生しますのでご注意ください。

関連記事

同じ通信処理をHttpURLConnectionを使って実装する方法について記事を書いています。
基本となるAndroidの通信処理となるため、一度目を通して理解しておくのをおすすめします。

また、通信の動作確認する際に以下の方法を使って確認しました。
サンプルコードのリクエストURLに以下のページに記載がある/get/postのURLを書きました。

タイトルとURLをコピーしました