1. okhttp ライブラリ
dependencies {
...
implementation 'com.squareup.okhttp3:okhttp:4.1.0'
}
まず、OkHttpClient のインスタンスを作成する必要があります
val client = OkHttpClient()
次に、HTTP リクエストを開始する場合は、Request オブジェクトを作成する必要があります。
val リクエスト = Request.Builder().build()
Request オブジェクトを強化するために、他の多くのメソッドが最後の build() メソッドの前に追加されます。たとえば、ターゲットのネットワーク アドレスは url() メソッドで設定できます。
val request = Request.Builder()
.url("https://www.baidu.com")
.build()
次に、OkHttpClient の newCall() メソッドを呼び出して Call オブジェクトを作成し、そのexecute() メソッドを呼び出してリクエストを送信し、サーバーから返されたデータを取得します。
val 応答 = client.newCall(request).execute()
Response オブジェクトはサーバーから返されるデータです。次の書き込みメソッドを使用して、返される特定のコンテンツを取得できます。
val 応答データ = 応答.body?.string()
POST リクエストは GET リクエストよりも少し複雑で、送信するパラメータを格納するリクエストボディオブジェクトを構築する必要があります。
val requestBody = FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build()
次に、Request.Builder の post() メソッドを呼び出し、RequestBody オブジェクトを渡します。
val request = Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build()
次の操作は GET リクエストと同じで、execute() メソッドを呼び出してリクエストを送信し、サーバーから返されたデータを取得するだけです。
使用:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sendRequestBtn.setOnClickListener {
sendRequestWithOkHttp()
}
}
...
private fun sendRequestWithOkHttp() {
thread {
try {
val client = OkHttpClient()
val request = Request.Builder()
.url("https://www.baidu.com")
.build()
val response = client.newCall(request).execute()
val responseData = response.body?.string()
if (responseData != null) {
showResponse(responseData)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
2. ネットワークリクエストコールバックの実装
アプリケーションは多くの場所でネットワーク機能を使用する可能性があり、HTTP リクエストを送信するコードは基本的に同じです。HTTP リクエストを送信するコードを毎回作成する場合、これは明らかに非常に悪い習慣です。
object HttpUtil {
...
fun sendOkHttpRequest(address: String, callback: okhttp3.Callback) {
val client = OkHttpClient()
val request = Request.Builder()
.url(address)
.build()
client.newCall(request).enqueue(callback)
}
}
// 回调onFinish()方法
listener.onFinish(response.toString())
} catch (e: Exception) {
e.printStackTrace()
// 回调onError()方法
listener.onError(e)
} finally {
connection?.disconnect()
}
}
}
}
インターフェイスには 2 つのメソッドが定義されています。 onFinish() メソッドは、サーバーがリクエストに正常に応答したときに呼び出されるという意味で、onError() メソッドは、ネットワーク操作でエラーが発生したときに呼び出されるという意味です。これら 2 つのメソッドにはパラメータがあり、onFinish() メソッドのパラメータはサーバーから返されたデータを表し、onError() メソッドのパラメータはエラーの詳細情報を記録します。
interface HttpCallbackListener {
fun onFinish(response: String)
fun onError(e: Exception)
}
まず、HttpCallbackListener パラメーターを sendHttpRequest() メソッドに追加し、メソッド内でサブスレッドを開き、サブスレッドで特定のネットワーク操作を実行します。return ステートメントは子スレッドのデータを返すことができないので、ここではサーバー応答データを HttpCallbackListener の onFinish() メソッドに渡します。例外が発生した場合は、例外の理由を onError() メソッドに渡します。現在、sendHttpRequest() メソッドは 2 つのパラメーターを受け取るため、呼び出し時に HttpCallbackListener のインスタンスも渡す必要があります。
HttpUtil.sendHttpRequest(address, object : HttpCallbackListener {
override fun onFinish(response: String) {
// 得到服务器返回的具体内容
}
override fun onError(e: Exception) {
// 在这里对异常情况进行处理
}
})
このようにして、サーバーが正常に応答すると、onFinish() メソッドで応答データを処理できます。同様に、例外が発生した場合、その例外は onError() メソッドで処理できます。このようにして、コールバック メカニズムを巧みに使用して、応答データを呼び出し元に正常に返します。
sendOkHttpRequest() メソッドには okhttp3.Callback パラメータがあり、これは OkHttp ライブラリに付属するコールバック インターフェイスで、先ほど作成した HttpCallbackListener と似ています。次に、 client.newCall() の後に、以前のようにexecute() メソッドを呼び出す代わりに、 enqueue() メソッドを呼び出し、okhttp3.Callback パラメータを渡します。OkHttp は enqueue() メソッド内でサブスレッドを開き、そのサブスレッドで HTTP リクエストを実行し、最終的なリクエスト結果を okhttp3.Callback にコールバックします。次に、sendOkHttpRequest() メソッドを呼び出すときに次のように記述できます。
HttpUtil.sendOkHttpRequest(address, object : Callback {
override fun onResponse(call: Call, response: Response) {
// 得到服务器返回的具体内容
val responseData = response.body?.string()
}
override fun onFailure(call: Call, e: IOException) {
// 在这里对异常情况进行处理
}
})
HttpURLConnection を使用するか OkHttp を使用するかにかかわらず、最終的なコールバック インターフェイスは子スレッドで実行されているため、 runOnUiThread() メソッドを使用してスレッド変換が実行されない限り、ここでは UI 操作を実行できないことに注意してください。
次へ: レトロフィットの使用方法