Android: solicitud de red de paquete simple de Kotlin OkHttp

1. La biblioteca okhttp

dependencies {
 ...
 implementation 'com.squareup.okhttp3:okhttp:4.1.0'
}

Primero necesitas crear una instancia de OkHttpClient

val cliente = OkHttpClient()

A continuación, si desea iniciar una solicitud HTTP, debe crear un objeto Solicitud:

solicitud de valor = Solicitud.Constructor().construir() 

Se agregan muchos otros métodos antes del método build() final para enriquecer el objeto Request. Por ejemplo, la dirección de red del objetivo se puede establecer mediante el método url()

val request = Request.Builder()
 .url("https://www.baidu.com")
 .build()

 Luego llame al método newCall() de OkHttpClient para crear un objeto Call y llame a su método execute() para enviar la solicitud y obtener los datos devueltos por el servidor.

val respuesta = cliente.nuevallamada(solicitud).ejecutar()

El objeto de respuesta son los datos devueltos por el servidor.Podemos usar el siguiente método de escritura para obtener el contenido específico devuelto

val responseData = respuesta.cuerpo?.string() 

Las solicitudes POST son un poco más complicadas que las solicitudes GET. Necesitamos crear un objeto Request Body para almacenar los parámetros que se enviarán.

val requestBody = FormBody.Builder()
 .add("username", "admin")
 .add("password", "123456")
 .build()

 Luego llame al método post() en Request.Builder y pase el objeto RequestBody

val request = Request.Builder()
 .url("https://www.baidu.com")
 .post(requestBody)
 .build()

 La siguiente operación es la misma que la solicitud GET, simplemente llame al método execute() para enviar la solicitud y obtener los datos devueltos por el servidor.

usar:

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. Implementación de devolución de llamada de solicitud de red

Es probable que una aplicación use funciones de red en muchos lugares, y el código para enviar solicitudes HTTP es básicamente el mismo. Si escribimos el código para enviar solicitudes HTTP cada vez, obviamente es una práctica muy mala, que se puede encapsular

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()
 }
 }
 }
}

En la interfaz se definen dos métodos: el método onFinish() significa que se llama cuando el servidor responde con éxito a nuestra solicitud, y onError() significa que se llama cuando ocurre un error en la operación de la red. Estos dos métodos tienen parámetros, los parámetros del método onFinish() representan los datos devueltos por el servidor y los parámetros del método onError() registran la información detallada del error. 

interface HttpCallbackListener {
 fun onFinish(response: String)
 fun onError(e: Exception)
}

Primero agregue un parámetro HttpCallbackListener al método sendHttpRequest() y abra un subproceso dentro del método y luego realice operaciones de red específicas en el subproceso. Tenga en cuenta que la declaración de devolución no puede devolver datos en el subproceso secundario, por lo que aquí pasamos los datos de respuesta del servidor al método onFinish() de HttpCallbackListener Si ocurre una excepción, pase el motivo de la excepción al método onError(). Ahora el método sendHttpRequest() recibe dos parámetros, por lo que también debemos pasar la instancia de HttpCallbackListener al llamarlo

HttpUtil.sendHttpRequest(address, object : HttpCallbackListener {
 override fun onFinish(response: String) {
 // 得到服务器返回的具体内容
 }
 override fun onError(e: Exception) {
 // 在这里对异常情况进行处理
 }
})

De esta forma, cuando el servidor responde con éxito, podemos procesar los datos de respuesta en el método onFinish(). De manera similar, si ocurre una excepción, la excepción se puede manejar en el método onError(). De esta forma, usamos hábilmente el mecanismo de devolución de llamada para devolver con éxito los datos de respuesta a la persona que llama.

Hay un parámetro okhttp3.Callback en el método sendOkHttpRequest() Esta es la interfaz de devolución de llamada que viene con la biblioteca OkHttp, similar al HttpCallbackListener que acabamos de escribir. Luego, después de client.newCall(), en lugar de llamar al método execute() como antes, llama a un método enqueue() y pasa el parámetro okhttp3.Callback. Creo que has adivinado los inteligentes. OkHttp ha abierto el subproceso para nosotros dentro del método enqueue(), y luego ejecuta la solicitud HTTP en el subproceso, y devuelve el resultado final de la solicitud a okhttp3.Callback. Entonces podemos escribir así al llamar al método 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) {
 // 在这里对异常情况进行处理
 }
})

Cabe señalar que, ya sea que use HttpURLConnection u OkHttp, la interfaz de devolución de llamada final aún se ejecuta en el subproceso secundario, por lo que no podemos realizar ninguna operación de IU aquí, a menos que la conversión del subproceso se realice con la ayuda del método runOnUiThread().

Siguiente: Cómo usar Retrofit

Supongo que te gusta

Origin blog.csdn.net/m0_59482482/article/details/129951755
Recomendado
Clasificación