Android - demande de réseau de paquet simple kotlin OkHttp

1. La bibliothèque okhttp

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

Vous devez d'abord créer une instance de OkHttpClient

val client = OkHttpClient()

Ensuite, si vous souhaitez lancer une requête HTTP, vous devez créer un objet Request :

val request = Request.Builder().build() 

De nombreuses autres méthodes sont ajoutées avant la méthode build() finale pour enrichir l'objet Request. Par exemple, l'adresse réseau de la cible peut être définie par la méthode url()

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

 Appelez ensuite la méthode newCall() de OkHttpClient pour créer un objet Call, et appelez sa méthode execute() pour envoyer la requête et obtenir les données renvoyées par le serveur

val réponse = client.newCall(request).execute()

L'objet Response correspond aux données renvoyées par le serveur. Nous pouvons utiliser la méthode d'écriture suivante pour obtenir le contenu spécifique renvoyé

val responseData = response.body?.string() 

Les requêtes POST sont un peu plus compliquées que les requêtes GET, nous devons construire un objet Request Body pour stocker les paramètres à soumettre.

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

 Appelez ensuite la méthode post() dans Request.Builder et transmettez l'objet RequestBody

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

 L'opération suivante est la même que la requête GET, il suffit d'appeler la méthode execute() pour envoyer la requête et obtenir les données renvoyées par le serveur.

utiliser:

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. Mise en œuvre du rappel de demande réseau

Une application est susceptible d'utiliser des fonctions réseau à de nombreux endroits, et le code pour envoyer des requêtes HTTP est fondamentalement le même. Si nous écrivons le code pour envoyer des requêtes HTTP à chaque fois, c'est évidemment une très mauvaise pratique, qui peut être encapsulée

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

Deux méthodes sont définies dans l'interface : la méthode onFinish() signifie qu'elle est appelée lorsque le serveur répond avec succès à notre requête, et onError() signifie qu'elle est appelée lorsqu'une erreur se produit dans le fonctionnement du réseau. Ces deux méthodes ont des paramètres, les paramètres de la méthode onFinish() représentent les données renvoyées par le serveur et les paramètres de la méthode onError() enregistrent les informations détaillées de l'erreur. 

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

Ajoutez d'abord un paramètre HttpCallbackListener à la méthode sendHttpRequest() et ouvrez un sous-thread à l'intérieur de la méthode, puis effectuez des opérations réseau spécifiques dans le sous-thread. Notez que l'instruction return ne peut pas renvoyer de données dans le thread enfant, nous transmettons donc ici les données de réponse du serveur à la méthode onFinish() de HttpCallbackListener. Si une exception se produit, transmettez la raison de l'exception à la méthode onError(). Maintenant, la méthode sendHttpRequest() reçoit deux paramètres, nous devons donc également transmettre l'instance de HttpCallbackListener lors de son appel

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

De cette façon, lorsque le serveur répond avec succès, nous pouvons traiter les données de réponse dans la méthode onFinish(). De même, si une exception se produit, l'exception peut être gérée dans la méthode onError(). De cette façon, nous utilisons intelligemment le mécanisme de rappel pour renvoyer avec succès les données de réponse à l'appelant.

Il existe un paramètre okhttp3.Callback dans la méthode sendOkHttpRequest(). Il s'agit de l'interface de rappel fournie avec la bibliothèque OkHttp, similaire au HttpCallbackListener que nous venons d'écrire. Ensuite, après client.newCall(), au lieu d'appeler la méthode execute() comme auparavant, une méthode enqueue() est appelée et le paramètre okhttp3.Callback est passé. Je crois que vous avez deviné les plus intelligents. OkHttp a ouvert le sous-thread pour nous dans la méthode enqueue(), puis exécute la requête HTTP dans le sous-thread et rappelle le résultat final de la requête à okhttp3.Callback. Ensuite, nous pouvons écrire comme ceci lors de l'appel de la méthode 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) {
 // 在这里对异常情况进行处理
 }
})

Il convient de noter que, que vous utilisiez HttpURLConnection ou OkHttp, l'interface de rappel finale est toujours en cours d'exécution dans le thread enfant. Nous ne pouvons donc effectuer aucune opération d'interface utilisateur ici, à moins que la conversion du thread ne soit effectuée à l'aide de la méthode runOnUiThread().

Suivant : Comment utiliser Retrofit

Je suppose que tu aimes

Origine blog.csdn.net/m0_59482482/article/details/129951755
conseillé
Classement