首页 > 编程语言 >如何提取用C#语言写的接口(http)里的内容

如何提取用C#语言写的接口(http)里的内容

时间:2024-08-30 09:14:33浏览次数:10  
标签:http String C# 接口 value var HTTP Response 请求

这段 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 请求,设置 doOutputtrue 并写入请求体。
处理响应
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 类型填充 dataliststr
错误处理
}.getOrElse {
    it.printStackTrace()
    Response().apply { str = it.message.toString() }
}
  • 如果在请求过程中发生异常,捕获并打印堆栈跟踪,同时返回一个包含错误信息的 Response 对象。

总结

  • 该代码定义了一个简单的异步 HTTP 请求机制,能够处理 GET 和 POST 请求,并将响应封装在 Response 对象中。
  • 使用 Kotlin 协程的 suspend 特性,使得网络请求可以在后台线程中异步执行,避免阻塞主线程。
  • 通过 runCatchinggetOrElse 处理异常,确保代码的健壮性。

注意事项

  • 确保在使用网络请求时处理权限(如 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

相关文章

  • maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
    开心一刻有一天螃蟹出门,不小心撞倒了泥鳅泥鳅很生气地说:你是不是瞎啊!螃蟹说:不是啊,我是螃蟹概述maven-shade-plugin官网已经介绍的很详细了,我给大家简单翻译一下Thispluginprovidesthecapabilitytopackagetheartifactinanuber-jar,includingitsdependenciesa......
  • opencv开发环境搭建
    从github下载opencv最新源码https://github.com/opencv/opencv,目前最新是5e93c8202363a13fc72df30f8c14069c5ab66e42.Ubuntu环境下编译安装依赖库:sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakegitlibgtk2.0-devpkg-configlibavcodec-devliba......
  • 肿瘤免疫治疗潜力靶点:CEACAM(癌胚抗原细胞粘附分子)
    前言:癌胚抗原细胞粘附分子(CEACAMs)与细胞黏附、细胞增殖、血管生成等细胞进程相关,在正常组织和肿瘤组织中表达不同,已成为癌症研究中备受关注的肿瘤相关抗原,是肺癌、结直肠癌、胰腺癌癌症等癌症的生物标记物和潜在治疗靶点。2023年AACR年会赛诺菲(Sanofi)公布了CEACAM5-ADC临......
  • openGauss-反向迁移gs_replicate
    openGauss-反向迁移gs_replicate特性简介支持openGauss的增量数据在线迁移至MySQL。客户价值反向迁移是指用户将源端数据库迁移到目标数据库,应用切到目标数据库后,再将目标端新产生的数据迁移回源端。反向迁移可满足用户业务迁移逃生的诉求,保持源端、目标端两个库并行运行,在目......
  • 【C++】vector(下)--上篇
    个人主页~vector(上)~vector二、vector的模拟实现1、了解组成2、vector.h(1)为什么有了size_t参数的vector构造函数还要再写一个int参数的重载vector构造函数(2)为什么reserve不用memcpy(3)reserve和resize的相关解释(4)迭代器失效问题详解二、vector的模拟实现1、了解组......
  • C# WPF 如何使用折线图方案
    使用WPF的时候经常会出现需要使用折线图、柱状图的情况,一下为折线图的使用方案一、导入NuGet包项目搜索导入LiveCharts.Wpf包二、后端配置折线图需要调用 LineSeries、柱状图调用LineSeries、具体使用图形可参考官方网站 官方网址: LiveCharts这里举例说明折线图的......
  • OpenCV(cv::findChessboardCorners())
    目录1.函数原型2.使用场景3.工作原理4.示例4.1角点精细化4.2附加标志5.注意事项cv::findChessboardCorners()是OpenCV提供的一个函数,常用于计算机视觉中的棋盘图像角点检测,特别是相机标定(calibration)和三维重建相关的任务中。1.函数原型boolcv::findChessboard......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • CBB是啥?
     在企业内部,CBB这一术语通常指的是“CommonBuildingBlocks”,即通用构建块。这一概念在多个领域,特别是产品开发和技术管理中,扮演着重要角色。以下是CBB在企业中的具体含义及其作用:CBB的定义CBB是指在不同产品、系统之间共用的零部件、模块、技术及其他相关的设计成果。它们是......
  • 【愚公系列】《AIGC辅助软件开发》002-AI智能化编程助手:GitHub Copilot
    ......