====== 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 { // エラー処理 }