首页 > 后端开发 > C++ > 正文

C++如何调用RESTful API?cpprestsdk (Casablanca)使用教程【网络编程】

尼克
发布: 2025-12-20 09:06:07
原创
860人浏览过
cpprestsdk是C++调用RESTful API最成熟跨平台方案,支持异步、HTTP客户端、JSON解析和URI处理;推荐vcpkg安装,Windows用cpprestsdk:x64-windows,Linux/macOS用x64-linux/x64-osx;示例通过http_client发起GET请求并解析JSON响应。

c++如何调用restful api?cpprestsdk (casablanca)使用教程【网络编程】

用 C++ 调用 RESTful API,cpprestsdk(Casablanca) 是目前最成熟、跨平台、原生支持异步的官方推荐方案。它封装了 HTTP 客户端、JSON 解析、URI 处理等能力,无需手动拼接 HTTP 报文或解析 JSON 字符串。

安装 cpprestsdk(Windows / Linux / macOS)

官方推荐通过 vcpkg 管理依赖,避免编译复杂性:

  • Windows(Visual Studio):vcpkg install cpprestsdk:x64-windows,然后在 CMake 或 VS 项目中启用 vcpkg 集成
  • Linux/macOS:vcpkg install cpprestsdk:x64-linux(或 x64-osx),导出为 system port 或使用 -DCMAKE_TOOLCHAIN_FILE

若需源码编译,注意开启 BUILD_TESTS=OFFBUILD_SAMPLES=OFF 加速构建,并确保已安装 OpenSSL、Boost(部分版本可选)、CMake 3.15+。

发起 GET 请求并解析 JSON 响应

以下是最简可用示例:获取 https://httpbin.org/get 并打印 query 参数回显:

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

#include <cpprest/http_client.h>
#include <cpprest/json.h>
#include <iostream>

using namespace web;
using namespace web::http;
using namespace web::http::client;
using json = web::json::value;

int main() {
    http_client client(U("https://httpbin.org"));
    auto resp = client.request(methods::GET, U("/get")).get();
    
    if (resp.status_code() == status_codes::OK) {
        auto body = resp.extract_json().get();
        std::wcout << L"Origin: " << body[U("origin")].as_string() << std::endl;
    }
}
登录后复制

关键点:

Intermediate Perl 电子书 chm版
Intermediate Perl 电子书 chm版

从一个Perl爱好者到一个Perl程序员。《Intermediate Perl》将教您如何把Perl作为编程语言来使用,而不仅只是作为一种脚本语言。   Perl是一种灵活多变、功能强大的编程语言,可以应用在从系统管理到网络编程再到数据库操作等很多方面。人们常说Perl让容易的事情变简单、让困难的事情变得可行。《Intermediate Perl》正是关于如何将技能从处理简单任务跃升到胜任困难任务的书籍。   本书提供对Perl中级编程优雅而仔细的介绍。由畅销的《学习Perl》作者所著,本书提供了《学习P

Intermediate Perl 电子书 chm版 0
查看详情 Intermediate Perl 电子书 chm版
  • http_client 构造时传入 base URI(不含路径),路径在 request() 中指定
  • get() 是同步阻塞调用;如需异步,用 then() 链式处理
  • extract_json() 自动识别 Content-Type 并解析;失败会抛异常,建议加 try/catch

发送 POST 请求(JSON Body + Headers)

向 API 提交结构化数据,例如登录请求:

json::value creds;
creds[U("username")] = json::value::string(U("alice"));
creds[U("password")] = json::value::string(U("secret123"));

http_request req(methods::POST);
req.set_request_uri(U("/login"));
req.set_body(creds);
req.headers().add(U("Content-Type"), U("application/json"));
req.headers().add(U("User-Agent"), U("MyCppApp/1.0"));

auto resp = client.request(req).get();
登录后复制

注意细节:

  • http_request 手动构造更灵活,适合设置 header、body、method 组合
  • JSON 字符串值必须用 json::value::string() 包装,不能直接写 L"xxx"
  • 中文等 Unicode 字符默认 UTF-8 编码,无需额外转码

错误处理与超时控制

网络请求必须考虑失败场景。cpprestsdk 默认无超时,需显式配置:

http_client_config config;
config.set_timeout(std::chrono::seconds(10)); // 全局超时
http_client client(U("https://api.example.com"), config);

try {
    auto resp = client.request(methods::GET, U("/data")).get();
    if (resp.status_code() >= 400) {
        auto err = resp.extract_string().get();
        std::wcerr << L"HTTP Error " << resp.status_code() << L": " << err << std::endl;
    }
} catch (const http_exception& e) {
    std::wcerr << L"Network or protocol error: " << e.what() << std::endl;
} catch (const std::exception& e) {
    std::wcerr << L"General error: " << e.what() << std::endl;
}
登录后复制

常见异常类型:

  • http_exception:连接失败、DNS 解析失败、SSL 握手失败等底层错误
  • std::exception 及其子类:JSON 解析失败、内存不足、URI 格式错误等
  • HTTP 状态码 4xx/5xx 不抛异常,需手动检查 status_code()

基本上就这些。cpprestsdk 上手略重于 curl + jsoncpp 组合,但胜在统一抽象、线程安全、异步友好,适合中大型 C++ 网络客户端项目。实际使用中记得始终处理异常、设置合理超时、验证 JSON 字段存在性(用 has_field()),避免崩溃。

以上就是C++如何调用RESTful API?cpprestsdk (Casablanca)使用教程【网络编程】的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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