0

0

c++怎么使用Poco库进行网络开发_c++ Poco::Net模块与HTTP客户端【案例】

尼克

尼克

发布时间:2026-01-03 19:00:50

|

317人浏览过

|

来源于php中文网

原创

使用Poco::Net实现HTTP GET需用HTTPClientSession传域名(如"httpbin.org")和端口,手动设Host头,用StreamCopier读响应体;HTTPS须调用initializeSSL()并链接OpenSSL库;POST需设Content-Type及chunked或Content-Length。

c++怎么使用poco库进行网络开发_c++ poco::net模块与http客户端【案例】

如何用 Poco::Net 实现一个基础 HTTP GET 请求

直接调用 Poco::Net::HTTPClientSessionPoco::Net::HTTPRequest 就能发请求,不需要自己处理 TCP 连接或解析状态行。关键点是主机名不能带 http://端口要显式指定(HTTPS 默认 443,HTTP 默认 80),否则会连错。

常见错误:传入 "https://api.example.com"HTTPClientSession 构造函数 → 报 Host not found;或者漏掉 setChunkedTransferEncoding(true) 导致 POST 失败。

  • HTTPClientSession 第一个参数只接受域名或 IP,比如 "httpbin.org",不是完整 URL
  • HTTP 请求必须手动设置 Host 头,Poco 不自动补全
  • 响应体要用 istream 逐块读,直接 response.getBody() 可能截断二进制内容
#include 
#include 
#include 
#include 
#include 
#include 

int main() {
    try {
        Poco::Net::HTTPClientSession session("httpbin.org", 80);
        Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, "/get?foo=bar", Poco::Net::HTTPMessage::HTTP_1_1);
        req.set("Host", "httpbin.org");
        
        session.sendRequest(req);
        Poco::Net::HTTPResponse resp;
        std::istream& rs = session.receiveResponse(resp);
        
        std::cout << "Status: " << resp.getStatus() << "\n";
        std::cout << "Reason: " << resp.getReason() << "\n";
        
        std::ostringstream oss;
        Poco::StreamCopier::copyStream(rs, oss); // 安全读取全部响应体
        std::cout << "Body: " << oss.str() << "\n";
    }
    catch (Poco::Exception& exc) {
        std::cerr << "Poco exception: " << exc.displayText() << "\n";
    }
}

HTTPS 请求必须链接 OpenSSL 并启用 SSL 初始化

不初始化 SSL 上下文就调用 HTTPS 会崩溃或卡死,错误提示常是 std::bad_cast 或无响应。Poco 的 HTTPS 支持依赖 OpenSSL,但不会自动加载动态库 —— 必须在程序启动时显式调用 Poco::Net::initializeSSL(),并在退出前调用 Poco::Net::uninitializeSSL()

  • Linux 下需链接 -lPocoNetSSL -lPocoCrypto -lssl -lcrypto,缺任意一个都会链接失败或运行时报 undefined symbol
  • Windows 若用静态链接,要定义 POCO_NO_UNWINDOWS 避免 WinSDK 冲突
  • 证书验证默认开启,测试时可临时禁用:ctx.usePrivateKey("client.key"); ctx.disableVerification();

POST 表单提交与 JSON 数据发送的区别在哪

表单提交用 application/x-www-form-urlencoded,JSON 用 application/json,两者不仅 Content-Type 不同,数据格式和编码方式也不同。Poco 不提供自动序列化,得自己拼字符串或用 Poco::JSON::Object 生成内容再写入请求体流。

Robovision AI
Robovision AI

一个强大的视觉AI管理平台

下载
  • POST 表单:用 req.set("Content-Type", "application/x-www-form-urlencoded"),body 是 "key1=value1&key2=value2" 格式,注意 URL 编码
  • POST JSON:设 "Content-Type: application/json",body 是合法 JSON 字符串,例如 {"name":"test"}
  • 必须调用 req.setChunkedTransferEncoding(true) 或显式设置 Content-Length,否则服务端收不到 body
// JSON POST 示例片段
Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, "/post", Poco::Net::HTTPMessage::HTTP_1_1);
req.set("Host", "httpbin.org");
req.set("Content-Type", "application/json");
req.setChunkedTransferEncoding(true);

std::ostream& os = session.sendRequest(req);
os << "{\"message\":\"hello\"}";
os.flush();

超时、重试和连接复用怎么控制

Poco 默认不启用连接复用(keep-alive),每次请求都新建 TCP 连接。要复用必须手动设置 Connection: keep-alive 头,并确保服务端也支持;超时分连接超时和读写超时,分别用 setTimeout()setReceiveTimeout() 控制,且单位是 Poco::Timespan(微秒)。

  • session.setTimeout(Poco::Timespan(5, 0)); → 连接建立超时 5 秒
  • session.setReceiveTimeout(Poco::Timespan(10, 0)); → 接收响应头/体超时 10 秒
  • 重试需自己实现:捕获 Poco::Net::NetExceptionPoco::TimeoutException 后重新构造 session 和 request
  • keep-alive 复用要求 session 对象复用(不能每次 new 一个),且服务端返回 Connection: keep-alive

HTTP/2、WebSocket、异步请求这些高级功能 Poco 原生不支持,得换库或自己封装底层 socket。

相关专题

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

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

404

2023.08.07

json是什么
json是什么

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

530

2023.08.23

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

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

308

2023.10.13

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

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

74

2025.09.10

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

302

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

708

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

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

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

253

2023.08.03

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

9

2026.01.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.6万人学习

Git 教程
Git 教程

共21课时 | 2.4万人学习

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

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