马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?站点注册
×
PBIDEA:uo_httpclient 发请求并处理 JSON 响应
一句话结论
用 uo_httpclient 发 HTTP 请求,核心要记住三点:Request() 返回的是 UTF-8 编码的 blob,必须 fromUtf8 转成字符串,再用 uo_json 解析。把这三个动作串起来,GET / POST / JSON 全部搞定。
1. 创建客户端
- uo_httpclient hc
- hc = create uo_httpclient
复制代码
create 时会触发 constructor,内部自动调用 hcCreate() 并建立 uo_response 响应对象。用完记得 destroy hc,否则底层的 winhttp 句柄不会释放。
2. GET 请求拿到 JSON
- string ls_json
- blob lbl_data
- lbl_data = hc.Request(hc.HttpGet, "https://api.example.com/users")
- ls_json = fromUtf8(lbl_data)
复制代码
Request 的第一个参数是动作常量:
- HttpGet = 1
- HttpPost = 2
- HttpPut = 3
- HttpPatch = 4
- HttpDelete = 5
返回值是 blob,也就是 UTF-8 的原始字节。中文必须 fromUtf8 才能正确显示,直接当字符串用会出现乱码,这是新手最容易踩的坑。
3. 把响应解析成 uo_json
- uo_json lj
- lj = hc.BlobToJson(lbl_data)
- string ls_name
- ls_name = lj.get("/users/0/name")
复制代码
BlobToJson 能直接把 UTF-8 的 blob 转成 uo_json 对象,再用路径语法(如 /users/0/name)取值,不用自己切字符串。
4. POST 一个 JSON 请求体
- uo_json lj_body
- lj_body = create uo_json
- lj_body.set("username", "test")
- lj_body.set("password", "123456")
- hc.SetHeader("Content-Type", "application/json")
- blob lbl_resp
- lbl_resp = hc.Request(hc.HttpPost, "https://api.example.com/login", lj_body)
- string ls_result
- ls_result = fromUtf8(lbl_resp)
- destroy lj_body
复制代码
把 uo_json 对象直接作为 Request 的第三个参数,组件会把它序列化成 JSON 请求体。由于 PBIDEA 未在导出源码里暴露该重载是否自动设置 Content-Type,如上例显式 SetHeader("Content-Type", "application/json") 最稳妥——不依赖组件内部行为,兼容性最好,也不用自己拼 JSON 字符串。
5. 带鉴权与自定义头
- hc.SetHeader("Accept", "application/json")
- hc.SetJWTAuth(token)
- hc.SetBasicAuth(user, pwd)
复制代码
- SetHeader 设置任意请求头;
- SetJWTAuth 填入 token 即可,组件自动加 Authorization: Bearer;
- SetBasicAuth 传入用户名和密码,组件自动做 Base64 编码。
6. 大文件下载
- blob lbl_file
- lbl_file = hc.DownLoad("https://x/y.zip") // 落内存 blob
- hc.DownLoadFile("https://x/y.zip", "d:\tmp\y.zip") // 直接落盘到文件
复制代码
下载进度可以挂 ondownload 事件回调,在界面上显示百分比,避免大文件时界面卡死。
7. 收尾与超时
- hc.SetTimeout(30000) // 超时单位:毫秒
- destroy hc
复制代码
SetTimeout 的参数是毫秒。如果接口偶尔慢,可以适当调大;生产环境建议显式设置,避免无限等待。
常见坑速查
- 忘记 fromUtf8:返回的中文全是乱码,这是第一常见问题。
- for 循环里内联声明变量非法:老 PB 不支持 for long i = 0 to n,要先 long i 再 for i = 0 to n。
- 声明与初始化拆两行更稳:uo_json lj / lj = create uo_json,兼容性最好。
- 字符串字面量用单引号没问题:PBIDEA 环境支持 '{"key":"值"}' 这种写法。
总结
uo_httpclient 把 winhttp 封装成了「一行 Request 发请求」,GET / POST / 文件下载 / JWT / Basic 鉴权都内置好了。只要记住「返回 blob → fromUtf8 转码 → uo_json 解析」这三步走,绝大多数接口对接场景都能直接落地。 |