使用 OkHttp 发送 POST 请求并解析 JSON 数据 - Kotlin 代码示例

本示例演示了如何使用 Kotlin 语言编写 HttpUtil 类,利用 OkHttp 库发送 POST 请求,并将 JSON 数据作为请求体,最终接收并解析响应数据。代码包含详细注释,解释了每个步骤的功能。

package com.example.modeldone.util

import android.os.Handler
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import java.io.IOException

object HttpUtil {
    val okHttpClient = OkHttpClient()
    val handler = Handler()
    val baseUrl = "http://119.3.168.89:8080"

    fun doPostForResult(url: String, jsonObject: JSONObject, listener: OnResultListener) {
        val data = jsonObject.toString()
        val toMediaTypeOrNull = "application/json; charset=utf-8".toMediaTypeOrNull()
        val toRequestBody = data.toRequestBody(toMediaTypeOrNull)

        val build = Request.Builder()
            .url(baseUrl + url)
            .post(toRequestBody)
            .build()

        okHttpClient.newCall(build).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                // 处理请求失败的情况
            }

            override fun onResponse(call: Call, response: Response) {
                val string = response.body!!.string()
                handler.post { listener.OnResult(string) }
            }
        })
    }
}

interface OnResultListener {
    fun OnResult(data: String)
}

代码说明

  1. 创建 OkHttpClient 对象:

    • val okHttpClient = OkHttpClient() 创建一个 OkHttpClient 实例,用于发送 HTTP 请求。
  2. 创建 Handler 对象:

    • val handler = Handler() 创建一个 Handler 对象,用于在主线程更新 UI。
  3. 定义 baseUrl:

    • val baseUrl = "http://119.3.168.89:8080" 定义 API 服务的根 URL。
  4. doPostForResult 函数:

    • fun doPostForResult(url: String, jsonObject: JSONObject, listener: OnResultListener) 定义一个函数,用于发送 POST 请求。
    • val data = jsonObject.toString() 将 JSONObject 转换为 JSON 字符串。
    • val toMediaTypeOrNull = "application/json; charset=utf-8".toMediaTypeOrNull() 设置请求体的媒体类型为 JSON。
    • val toRequestBody = data.toRequestBody(toMediaTypeOrNull) 将 JSON 字符串转换为 RequestBody。
    • val build = Request.Builder() 创建一个 Request.Builder 对象。
    • .url(baseUrl + url) 设置请求的 URL。
    • .post(toRequestBody) 设置请求方法为 POST,并将 RequestBody 添加到请求中。
    • .build() 构建请求对象。
    • okHttpClient.newCall(build).enqueue(object : Callback { ... }) 使用 OkHttpClient 发送请求,并设置回调函数处理响应结果。
    • 在回调函数中,使用 response.body!!.string() 获取响应数据。
    • 使用 Handler 在主线程中更新 UI,并将数据传递给 OnResultListener 接口的 OnResult 方法。
  5. OnResultListener 接口:

    • interface OnResultListener { fun OnResult(data: String) } 定义一个接口,用于接收响应数据并进行处理。

Dart 代码实现

使用 Dart 语言和 http 包实现类似功能的代码示例:

import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart' as http;

class HttpUtil {
  static final String baseUrl = "http://119.3.168.89:8080";

  static Future<void> doPostForResult(String url,
      Map<String, dynamic> jsonObject, OnResultListener listener) async {
    final data = jsonEncode(jsonObject);
    final response = await http.post(Uri.parse(baseUrl + url),
        headers: {"Content-Type": "application/json; charset=utf-8"},
        body: data);
    if (response.statusCode == HttpStatus.ok) {
      final string = response.body;
      listener.onResult(string);
    }
  }
}

abstract class OnResultListener {
  void onResult(String data);
}

代码说明

  1. 导入必要库:

    • import 'dart:convert'; 导入 dart:convert 库,用于 JSON 编码和解码。
    • import 'dart:io'; 导入 dart:io 库,用于获取 HTTP 状态码。
    • import 'package:http/http.dart' as http; 导入 http 包,用于发送 HTTP 请求。
  2. 定义 baseUrl:

    • static final String baseUrl = "http://119.3.168.89:8080"; 定义 API 服务的根 URL。
  3. doPostForResult 函数:

    • static Future<void> doPostForResult(String url, Map<String, dynamic> jsonObject, OnResultListener listener) async { ... } 定义一个异步函数,用于发送 POST 请求。
    • final data = jsonEncode(jsonObject); 将 Map 转换为 JSON 字符串。
    • final response = await http.post(Uri.parse(baseUrl + url), headers: {"Content-Type": "application/json; charset=utf-8"}, body: data); 使用 http.post 发送 POST 请求,设置请求头和请求体。
    • if (response.statusCode == HttpStatus.ok) { ... } 判断响应状态码是否为 200 (OK)。
    • final string = response.body; 获取响应数据。
    • listener.onResult(string); 调用 OnResultListener 接口的 onResult 方法,将数据传递给监听器。
  4. OnResultListener 接口:

    • abstract class OnResultListener { void onResult(String data); } 定义一个抽象类,用于接收响应数据并进行处理。

总结

本文演示了使用 Kotlin 和 Dart 语言发送 POST 请求并解析 JSON 数据的示例代码。两种语言的实现方式各有优劣,选择合适的语言取决于项目的具体需求。

Android HttpUtil 类使用 OkHttp 发送 POST 请求并解析 JSON 数据 - Kotlin 代码示例

原文地址: https://www.cveoy.top/t/topic/oXh7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录