mcpField
K
kuikly-network-and-json

kuikly-network-and-json

github.com/tencent-tds开发134439 次安装11 周前更新
代码仓库

关于 kuikly-network-and-json

面向 Kuikly 开发者的网络与 JSON 使用指南,涵盖 HTTP 和二进制请求、响应处理及安全解析 JSON。

主要功能

  1. 01获取和缓存 NetworkModule
  2. 02发送 GET、POST 与通用 HTTP 请求
  3. 03上传和下载二进制数据
  4. 04配置请求头、Cookie 和超时
  5. 05使用 opt 方法安全读取 JSON

适用场景

  1. 01向 API 发送 GET 或 POST 请求
  2. 02上传文件或下载二进制内容
  3. 03解析可能缺少字段的 JSON 响应

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tencent-tds/kuiklyui-ai --skill kuikly-network-and-json

安装后在 Claude Code 中输入/kuikly-network-and-json确认已加载。

附带文件references/JSON_API_REFERENCE.mdreferences/NETWORK_API_REFERENCE.md

详细介绍

来自项目 README

Kuikly 网络请求

Contents

Core Guidelines

  • 获取 NetworkModule:
    • Kuikly DSL(Pager / ComposeView): 直接调用 acquireModule<NetworkModule>(NetworkModule.MODULE_NAME) 获取(找不到时抛异常),或用 getModule<NetworkModule>(NetworkModule.MODULE_NAME) 安全获取(找不到返回 null)。推荐 lazy 缓存实例。
    • Compose DSL(@Composable 函数中): 通过 LocalActivity.current.getPager() 获取 Pager 实例,再调用 pager.acquireModule<NetworkModule>(NetworkModule.MODULE_NAME)。在 ComposeContainer 类内部(非 @Composable 上下文)可直接调用 acquireModule。
  • 检查 success: 回调中先判断 success,为 true 时才安全使用 data。失败时通过 errorMsg 和 response.statusCode(注意:Int? 可空)排查。
  • 设置超时: httpRequest / httpRequestBinary 可指定 timeout(秒),默认 30。
  • 非 JSON 回包: SDK 自动包装为 {"data": "原始内容"},通过 data.optString("data") 获取。

Workflow: HTTP Requests

方法选择:

场景方法
简单 GET(无自定义 headers)requestGet(url, param, callback)
简单 POST(无自定义 headers)requestPost(url, param, callback)
自定义 headers / Cookie / 超时httpRequest(url, isPost, param, headers, cookie, timeout, callback)

完整方法签名和参数说明见 NetworkModule API 参考。

获取 NetworkModule

Kuikly DSL(在 Pager / ComposeView 中):

import com.tencent.kuikly.core.module.NetworkModule

// lazy 延迟初始化(推荐)
private val networkModule by lazy(LazyThreadSafetyMode.NONE) {
    acquireModule<NetworkModule>(NetworkModule.MODULE_NAME)
}

Compose DSL(在 @Composable 函数中):

import com.tencent.kuikly.core.module.NetworkModule
import com.tencent.kuikly.compose.ui.platform.LocalActivity
import com.tencent.kuikly.core.pager.Pager

@Composable
fun MyScreen() {
    val pager = LocalActivity.current.getPager() as Pager
    val networkModule = pager.acquireModule<NetworkModule>(NetworkModule.MODULE_NAME)
    // 使用 networkModule 发起请求...
}

Compose DSL(在 ComposeContainer 类内部):

@Page("MyComposePage")
class MyComposePage : ComposeContainer() {
    // ComposeContainer 继承自 Pager,可直接调用 acquireModule
    private val networkModule by lazy(LazyThreadSafetyMode.NONE) {
        acquireModule<NetworkModule>(NetworkModule.MODULE_NAME)
    }
}
GET 请求
networkModule.requestGet(
    "https://example.com/api/data",
    JSONObject().apply { put("key", "value") }
) { data, success, errorMsg, response ->
    if (success) {
        val name = data.optString("name")
        val count = data.optInt("count")
    } else {
        val statusCode = response.statusCode // Int? 可能为 null
    }
}
POST 请求
networkModule.requestPost(
    "https://example.com/api/submit",
    JSONObject().apply {
        put("username", "test")
        put("password", "123456")
    }
) { data, success, errorMsg, response ->
    if (success) {
        val result = data.optString("result")
    }
}
通用请求(httpRequest)
networkModule.httpRequest(
    url = "https://example.com/api/data",
    isPost = true,
    param = JSONObject().apply { put("id", 1) },
    headers = JSONObject().apply {
        put("Content-Type", "application/json")
        put("Authorization", "Bearer token")
    },
    cookie = "session_id=abc123",
    timeout = 30
) { data, success, errorMsg, response ->
    // response.statusCode   - HTTP 状态码(Int?)
    // response.headerFields - 响应头(JSONObject)
    if (success) { /* 处理数据 */ }
}

Workflow: Binary Requests

方法选择:

场景方法
下载二进制(GET)requestGetBinary(url, param, callback)
上传二进制(POST)requestPostBinary(url, bytes, callback)
自定义 headers / Cookie / 超时httpRequestBinary(url, isPost, bytes, param, headers, cookie, timeout, callback)

requestPostBinary 内部 param 传 null。若需同时传 binary body 和 query 参数,使用 httpRequestBinary。

下载二进制(GET)
networkModule.requestGetBinary(
    "https://example.com/file.png",
    JSONObject()
) { data, success, errorMsg, response ->
    if (success) {
        val fileBytes: ByteArray = data
    }
}
上传二进制(POST)
networkModule.requestPostBinary(
    "https://example.com/upload",
    imageBytes
) { data, success, errorMsg, response ->
    if (success) {
        val responseBytes: ByteArray = data
    }
}
通用二进制请求(httpRequestBinary)
networkModule.httpRequestBinary(
    url = "https://example.com/api/binary",
    isPost = true,
    bytes = uploadBytes,
    param = JSONObject().apply { put("type", "image") },
    headers = JSONObject().apply { put("Content-Type", "application/octet-stream") },
    cookie = "session_id=abc123",
    timeout = 60
) { data, success, errorMsg, response ->
    if (success) {
        val responseBytes: ByteArray = data
    }
}

Workflow: Parsing JSON

使用 opt* 系列方法安全读取(不会抛异常,返回默认值)。

完整的 JSONObject/JSONArray API 列表见 JSON API 参考。

核心用法示例
val jsonObj = JSONObject(jsonString)

// 安全读取(不存在时返回默认值)
val str = jsonObj.optString("key")             // 默认 ""
val num = jsonObj.optInt("key")                // 默认 0
val innerObj = jsonObj.optJSONObject("nested")  // JSONObject?
val array = jsonObj.optJSONArray("list")        // JSONArray?

// 写入
jsonObj.put("key", "value")

// 遍历所有 key
for (key in jsonObj.keys()) { /* ... */ }
JSONArray 遍历
val jsonArr = jsonObj.optJSONArray("list") ?: JSONArray()
for (i in 0 until jsonArr.length()) {
    val item = jsonArr.optJSONObject(i) ?: continue
    val name = item.optString("name")
}

参考资源

评论

支持 Markdown