Androidアプリで通信処理を作る方法はいくつかあります。
今回はそのうちの一つであるOkHttpを使った方法を簡単にではありますがまとめていきます。
特に、頻繁に使われるHTTPメソッドのGETとPOSTのサンプルコードを載せていきます。
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に関わらず以下の順番で通信処理を開始します。
- OkHttpClientを作成
- Requestを作成
- 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を書きました。