OkHttpでHTTP通信 (Android Kotlin)

/




今回は、OkHttpを使ってHTTPリクエストの動作確認を行ってみた。また既存のHttpURLConnectionバージョンとも比較してみた。



やること


OkHttpと、Java / Kotlin標準のHttpURLConnectionを使って、GET、POSTリクエストの動作確認を行った。


完成イメージ(MainActivityからの呼び出し)




MainActivityからの事項例はこの様になる。


各メソッドでやっていることは単純だ。

1. HTTPクライアント作成
2. バックグラウンドタスクへ委譲
3. コールバックを受け取り、値をViewへ反映

サーバーにはGETとPOSTで出力メッセージを切り替えるだけの、簡単なプログラムを置いた。




HTTPクライアントのインタフェースを作る


HTTPクライアントをバックグラウンドタスクへ委譲するため、このようなインタフェースを作ることにした。

interface HTTPClient {
    val url:String
    val body:String?
    fun request(): String?
}



このインタフェースを実装して、OkHttpClientおよびVerboseHttpClientを作ることにする。






OkHttpClientでPOSTのBodyを用意する


OkHttpではPOSTのパラメータを渡すときに、次のようにビルダーで生成しなければならない。

fun buildMultipartBody(body:String):MultipartBody {
    val builder = MultipartBody.Builder().setType(MultipartBody.FORM)

    for ((k, v) in body.toParams()) {
        builder.addFormDataPart(k, v)
    }
    return builder.build()
}


key1=value1&key2=value2 のような形式の文字列は、そのまま渡せないのでパースする。

Stringクラスを拡張してパースしてみた。

fun String.toParams():List<List<String>> = this
	.split(Regex("&"))
	.map { it.split(Regex("=")) }




AsyncTaskを継承したHTTPTask


HTTPTask`は次の様になっている。



コンストラクトに渡されるジェネリック型Tのactivityは、where以降で制約している通り、AppCompatActivityとHTTPTask.Listenerを実装している必要がある。

循環参照対策として、渡されたActivityはWeakReferenceに指定している。

こちらの記事を大いに参考させてもらった。

AsyncTaskに安全にcallbackを持たせたい


関連記事


非同期 & ネットワーク処理
* はじめてRetrofitを使ってみる (Android Kotlin)
* 非同期処理でCoroutine(コルーチン)を使ってみる (Android Kotlin)
* OkHttpでHTTP通信 (Android Kotlin)
* スレッド処理 (Android Kotlin)

View & レイアウト
* リサイクラービューを使ってリスト表示 (Android Kotlin)
* 角丸表現 (Android Kotlin)
* onSaveInstanceStateで画面回転時の状態の保存と復元 (Android Kotlin)
* ListViewを簡単なモデルで理解しよう (Android Kotlin)
* バネアニメーション (Android Kotlin)
* startActivityForResultを使ってみる (Android Kotlin)
* ActivityとFragmentの連携を理解する (Android Kotlin)
* DataBinding機能を使ってみる (Android Kotlin)
* タッチイベントのフック (Android Kotlin)
* DialogFragmentを使ったダイアログの表示 (Android Kotlin)

サウンド
* これってSoundPoolのバグ?(Android Kotlin)
* SoundPoolを使ってゲームの効果音を再生する (Android Kotlin)

データ & オブジェクト
* Kotlinでオブジェクト(object)の動作確認
*
データクラスとタプル (Android Kotlin)
* Null安全、ぬるぽバイバイ (Android Kotlin)