0

0

c++如何使用rest sdk调用接口_c++ cpprestsdk异步请求与json解析【实战】

冰火之心

冰火之心

发布时间:2026-01-02 16:25:46

|

157人浏览过

|

来源于php中文网

原创

cpprestsdk发起post需设content_type并用extract_json()解析响应,异步请求须用then链式处理,uri拼接推荐uri_builder。

c++如何使用rest sdk调用接口_c++ cpprestsdk异步请求与json解析【实战】

cpprestsdk 发起 POST 请求并解析 JSON 响应

cpprestsdk(即 Casablanca)本身不内置 JSON Schema 验证,但提供 json::value 类型支持原生解析和构造。异步请求必须搭配 then() 链式处理,不能直接用 get() 同步阻塞(尤其在 UI 线程或高并发服务中易引发死锁)。

  • http_client 构造时 URL 末尾不加斜杠不影响请求,但路径拼接建议统一由 uri_builder 处理,避免手动字符串拼接出错
  • POST body 必须显式设置 content_type,否则服务端可能拒收:L"application/json" 是最常用值,注意宽字符前缀 L
  • 响应体读取必须调用 response.extract_json(),不能直接对 response.body()json::value::parse() —— 后者会丢弃编码信息且不处理流式响应
auto client = http_client(U("https://api.example.com"));
auto req = http_request(methods::POST);
req.set_request_uri(U("/v1/data"));
req.headers().add(U("Authorization"), U("Bearer abc123"));
req.set_body(json::value::object({
    { U("query"), json::value::string(U("user")) },
    { U("limit"), json::value::number(10) }
}).serialize(), U("application/json"));

client.request(req).then([](http_response response) -> pplx::task<json::value> {
    if (response.status_code() != status_codes::OK) {
        throw std::runtime_error("HTTP error: " + std::to_string(response.status_code()));
    }
    return response.extract_json(); // ← 关键:必须用 extract_json()
}).then([](json::value json_obj) {
    auto items = json_obj.at(U("results")).as_array();
    for (const auto& item : items) {
        wcout << item.at(U("id")).as_string() << endl;
    }
}).wait(); // 仅调试用;生产环境应延续 then 链或用 .get() 在独立线程

异步链中捕获网络异常与 HTTP 错误

cpprestsdk 的异常不是标准 std::exception 子类,而是 web::http::http_exception 或底层 std::system_error。直接 try/catch 外层任务会漏掉内部异步阶段抛出的异常 —— 必须在每个 then() 回调里检查 response.status_code(),或统一用 .then([](pplx::task<:value> t) { try { t.get(); } catch(...) {...} })</:value> 包裹。

  • http_exception 通常来自 DNS 失败、连接超时、SSL 握手失败等,t.get() 会 rethrow 它
  • HTTP 4xx/5xx 响应不会自动抛异常,需手动判断 status_code() 并决定是否 throw
  • 超时需在 http_client_config 中设置:config.set_timeout(std::chrono::seconds(15));,否则默认无超时

json::value 解析常见陷阱

json::value 是引用语义,频繁调用 at() 可能抛 json_exception(键不存在),且不支持类似 Python 的 .get(key, default) 模式。嵌套深时容易写成 obj.at(U("a")).at(U("b")).at(U("c")),一旦中间某层缺失就崩溃。

Okaaaay
Okaaaay

适用于所有人的AI文本和内容生成器

下载
  • 安全访问推荐先用 has_field() 判断,再 at();或封装工具函数如 safe_get(obj, {U("a"), U("b"), U("c")})
  • as_string() 返回 utility::string_t(即 std::wstring),若服务端返回 UTF-8 字符串但未声明 Content-Type: application/json; charset=utf-8,可能乱码 —— 此时需手动用 utf8_to_utf16() 转换
  • 数值类型区分 as_number()(浮点)和 as_integer()(整型),但 JSON 标准无整数/浮点之分,服务端传 42.0 会导致 as_integer() 抛异常

Windows 下链接 cpprestsdk 的关键配置

Visual Studio 项目必须同时满足三项,缺一不可,否则出现 LNK2019 找不到 http_client::request 等符号:

立即学习C++免费学习笔记(深入)”;

  • 附加依赖项加入:cpprest142_2_10.lib(版本号随 SDK 更新变化,查 %VCPKG_ROOT%\installed\x64-windows\lib 确认)
  • C/C++ → 语言 → 符合模式 设为“否”,否则 C++17 的某些特性(如 structured binding)会与 SDK 冲突
  • 预处理器定义添加:_NO_ASYNCRTIMP(禁用动态链接 AsyncRT,避免 DLL 版本不匹配)

Linux/macOS 用户用 vcpkg 安装后,链接时需确保 -lcpprest -lboost_system -lssl -lcrypto -lz 顺序正确,libssl 必须在 libcpprest 之后。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

452

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

328

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号