Okhttpクライアント

一つ上へ

基本的な使い方

まず、OkHttpの依存関係をプロジェクトに追加する。

implementation("com.squareup.okhttp3:okhttp:4.9.3")

次に、OkHttpクライアントを作成する.

val client = OkHttpClient()

リクエストオブジェクトを作成する

val request = Request.Builder()
  .url("url")
  .build()

リクエストを送信する

OkHttpClient().newCall(request).execute().use { response ->
  if (!response.isSuccessful) throw RuntimeException() // <- これはエラーハンドリング
}

ヘッダーの追加

ヘッダーを追加するにはaddHeaderメソッドを使用する。

val request = Request.Builder()
  .url("site_url")
  .addHeader("key", "val") // key と val を設定する
  .addHeader("Content-Type", "text/xml") // Content-Typeの設定の一例
  .build()

POSTメソッドの送信について

POSTメソッドを用いてアクセスするにはpost()を使用する。

まずはリクエストボディーを作成し、それを指定してリクエストを作成する。

val request_body = "request"
val request = Request.Builder()
  .url(url)
  .post(request_body)
  .build()

val response = OkHttpClient().newCall(request).execute()

XMLを送信する方法

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
 
fun function() {
  val xml = """
    <?xml version="1.0" encoding="UTF-8"?>
    <aaa>
      <bbb>val1</bbb>
      <ccc>val2</ccc>
    </aaa>
  """.trimIndent()
 
  val media_type = "application/xml".toMediaTypeOrNull()
  val request_body = xml.toRequestBody(media_type)
  val request = Request.Builder()
    .url(url)
    .post(request_body)
    .build()
 
  val response = OkHttpClient().newCall(request).execute()
  // 後続処理
}

テキスト形式のリクエストボディーを作成する場合

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
 
fun func() {
  val text = "This is a sample."
  val media_type = "text/plain".toMediaTypeOrNull()
  val request_body = text.toRequestBody(media_type)
  val request = Request.Builder()
    .url(url)
    .post(request_body)
    .build()
 
  val response = OkHttpClient().newCall(request).execute()
}

JSON形式のリクエストボディーを作成する場合

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
 
fun func() {
  val media_type = "application/json; charset=utf-8".toMediaType()
  val json = "{\"user\":\"NK\",\"text\":\"Hello\"}"
  val request_body = json.toRequestBody(media_type)
  val request = Request.Builder()
    .url(url)
    .post(request_body)
    .build()
 
  val response = OkHttpClient().newCall(request).execute()
}

HTTPリクエストのタイムアウト値を設定する

Call インターフェースのtimeoutメソッドを使用する。 メソッドは3種類ある。以下、設定例。

val client = OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .build()

val request = Request.Builder()
    .url("http://example.com")
    .build()

val call = client.newCall(request)
call.timeout().timeout(60, TimeUnit.SECONDS)
val response = call.execute()

エラー処理

レスポンスボディーがnullの場合の処理

val response = client.newCall(request).execute()
val responseBody = response?.body?.string()
 
if (response.isSuccessful && responseBody != null) {
    // レスポンスボディを処理する
} else {
    // エラー処理
}