如何提取用C#語(yǔ)言寫(xiě)的接口(http)里的內(nèi)容
這段 Kotlin 代碼定義了一個(gè)用于發(fā)起 HTTP 請(qǐng)求的異步函數(shù)和相關(guān)的數(shù)據(jù)模型。下面是對(duì)代碼的詳細(xì)解析,包括每個(gè)部分的功能和工作原理。
代碼解析
1. Response 數(shù)據(jù)類
data class Response(
var data: JSONObject = JSONObject(),
var list: JSONArray = JSONArray(),
var str: String = "",
var code: Int = 0,
var success: Boolean = false
)
Response是一個(gè)數(shù)據(jù)類,用于封裝 HTTP 請(qǐng)求的響應(yīng)。- 包含以下屬性:
data: 用于存儲(chǔ)返回的 JSON 對(duì)象。list: 用于存儲(chǔ)返回的 JSON 數(shù)組。str: 用于存儲(chǔ)其他類型的返回值(如字符串)。code: HTTP 狀態(tài)碼。success: 請(qǐng)求是否成功的標(biāo)志。
2. get 函數(shù)
suspend fun get(url: String): Response = requst(url, "GET", "")
get是一個(gè)掛起函數(shù)(suspend),可以在協(xié)程中調(diào)用。- 它接受一個(gè) URL 字符串,調(diào)用
requst函數(shù)發(fā)起一個(gè) GET 請(qǐng)求,并返回Response對(duì)象。
3. requst 函數(shù)
suspend fun requst(url: String, method: String, body: String): Response = withContext(IO) {
requst是一個(gè)掛起函數(shù),用于發(fā)起 HTTP 請(qǐng)求。- 使用
withContext(IO)切換到 IO 線程,以避免阻塞主線程。
HTTP 請(qǐng)求邏輯
(URL("${baseURL}Values/${url}").openConnection() as HttpURLConnection).runCatching {
- 使用
URL類創(chuàng)建一個(gè) HTTP 連接。 runCatching用于捕獲可能拋出的異常,確保在發(fā)生錯(cuò)誤時(shí)不會(huì)崩潰。
設(shè)置請(qǐng)求方法
requestMethod = method
if (method == "POST") {
doOutput = true
outputStream.bufferedWriter().use { it.write(body) }
}
- 根據(jù)
method參數(shù)設(shè)置請(qǐng)求方法(GET 或 POST)。 - 如果是 POST 請(qǐng)求,設(shè)置
doOutput為true并寫(xiě)入請(qǐng)求體。
處理響應(yīng)
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()
}
}
}
- 創(chuàng)建
Response對(duì)象并設(shè)置狀態(tài)碼和成功標(biāo)志。 - 使用
inputStream讀取響應(yīng)體,并根據(jù)返回的 JSON 類型填充data、list或str。
錯(cuò)誤處理
}.getOrElse {
it.printStackTrace()
Response().apply { str = it.message.toString() }
}
- 如果在請(qǐng)求過(guò)程中發(fā)生異常,捕獲并打印堆棧跟蹤,同時(shí)返回一個(gè)包含錯(cuò)誤信息的
Response對(duì)象。
總結(jié)
- 該代碼定義了一個(gè)簡(jiǎn)單的異步 HTTP 請(qǐng)求機(jī)制,能夠處理 GET 和 POST 請(qǐng)求,并將響應(yīng)封裝在
Response對(duì)象中。 - 使用 Kotlin 協(xié)程的
suspend特性,使得網(wǎng)絡(luò)請(qǐng)求可以在后臺(tái)線程中異步執(zhí)行,避免阻塞主線程。 - 通過(guò)
runCatching和getOrElse處理異常,確保代碼的健壯性。
注意事項(xiàng)
- 確保在使用網(wǎng)絡(luò)請(qǐng)求時(shí)處理權(quán)限(如 Android 中的網(wǎng)絡(luò)權(quán)限)。
- 根據(jù)需要處理不同的 HTTP 狀態(tài)碼,可能需要更復(fù)雜的錯(cuò)誤處理邏輯。
- 考慮使用更高級(jí)的庫(kù)(如 Retrofit 或 Ktor)來(lái)簡(jiǎn)化網(wǎng)絡(luò)請(qǐng)求的處理。
這個(gè)函數(shù)使用了我們之前寫(xiě)的get方法來(lái)讀取數(shù)據(jù)
private fun search() {
lifecycleScope.launch {
try {
//“Matches?key=${root.findViewById<EditText>(R.id.etSearch).text}”這個(gè)是數(shù)據(jù)網(wǎng)址
//這里讀取的是數(shù)據(jù)中的list
val res = get("Matches?key=${root.findViewById<EditText>(R.id.etSearch).text}").list
} catch (e: Exception) {
// 錯(cuò)誤處理
Toast.makeText(root.context, "搜索失敗: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
}
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() }
}
}

浙公網(wǎng)安備 33010602011771號(hào)