====== Okhttpクライアント ======
[[:kotlin|一つ上へ]]
===== 基本的な使い方 =====
まず、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 = """
val1
val2
""".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 {
// エラー処理
}