这段 Kotlin 代码定义了一个用于发起 HTTP 请求的异步函数和相关的数据模型。下面是对代码的详细解析,包括每个部分的功能和工作原理。
代码解析
1. Response
数据类
data class Response(
var data: JSONObject = JSONObject(),
var list: JSONArray = JSONArray(),
var str: String = "",
var code: Int = 0,
var success: Boolean = false
)
Response
是一个数据类,用于封装 HTTP 请求的响应。- 包含以下属性:
data
: 用于存储返回的 JSON 对象。list
: 用于存储返回的 JSON 数组。str
: 用于存储其他类型的返回值(如字符串)。code
: HTTP 状态码。success
: 请求是否成功的标志。
2. get
函数
suspend fun get(url: String): Response = requst(url, "GET", "")
get
是一个挂起函数(suspend
),可以在协程中调用。- 它接受一个 URL 字符串,调用
requst
函数发起一个 GET 请求,并返回Response
对象。
3. requst
函数
suspend fun requst(url: String, method: String, body: String): Response = withContext(IO) {
requst
是一个挂起函数,用于发起 HTTP 请求。- 使用
withContext(IO)
切换到 IO 线程,以避免阻塞主线程。
HTTP 请求逻辑
(URL("${baseURL}Values/${url}").openConnection() as HttpURLConnection).runCatching {
- 使用
URL
类创建一个 HTTP 连接。 runCatching
用于捕获可能抛出的异常,确保在发生错误时不会崩溃。
设置请求方法
requestMethod = method
if (method == "POST") {
doOutput = true
outputStream.bufferedWriter().use { it.write(body) }
}
- 根据
method
参数设置请求方法(GET 或 POST)。 - 如果是 POST 请求,设置
doOutput
为true
并写入请求体。
处理响应
Response().apply {
code = responseCode
success = responseCode in 200..299
inputStream.bufferedReader().use {
when (val value = JSONTokener(it.readLine()).nextValue()) {
is JSONObject -> data = value
is JSONArray -> list = value
else -> str = value.toString()
}
}
}
- 创建
Response
对象并设置状态码和成功标志。 - 使用
inputStream
读取响应体,并根据返回的 JSON 类型填充data
、list
或str
。
错误处理
}.getOrElse {
it.printStackTrace()
Response().apply { str = it.message.toString() }
}
- 如果在请求过程中发生异常,捕获并打印堆栈跟踪,同时返回一个包含错误信息的
Response
对象。
总结
- 该代码定义了一个简单的异步 HTTP 请求机制,能够处理 GET 和 POST 请求,并将响应封装在
Response
对象中。 - 使用 Kotlin 协程的
suspend
特性,使得网络请求可以在后台线程中异步执行,避免阻塞主线程。 - 通过
runCatching
和getOrElse
处理异常,确保代码的健壮性。
注意事项
- 确保在使用网络请求时处理权限(如 Android 中的网络权限)。
- 根据需要处理不同的 HTTP 状态码,可能需要更复杂的错误处理逻辑。
- 考虑使用更高级的库(如 Retrofit 或 Ktor)来简化网络请求的处理。
suspend fun get(url: String): Response = requst(url, "GET", "")
data class Response(
var data: JSONObject = JSONObject(),
var list: JSONArray = JSONArray(),
var str: String = "",
var code: Int = 0,
var success: Boolean = false
)
suspend fun requst(url: String, method: String, body: String): Response = withContext(IO){
(URL("${baseURL}Values/${url}").openConnection() as HttpURLConnection).runCatching {
requestMethod = method
if (method == "POST"){
doOutput = true
outputStream.bufferedWriter().use { it.write(body) }
}
Response().apply {
code = responseCode
success = responseCode in 200..299
inputStream.bufferedReader().use {
when(val value = JSONTokener(it.readLine()).nextValue()){
is JSONObject -> data = value
is JSONArray -> list = value
else -> str = value.toString()
}
}
}
}.getOrElse {
it.printStackTrace()
Response().apply { str = it.message.toString() }
}
}
![](/i/l/?n=24&i=blog/3511209/202408/3511209-20240830091738308-626048748.png)
标签:http,String,C#,接口,value,var,HTTP,Response,请求
From: https://www.cnblogs.com/XinBing1335/p/18387427