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

17次阅读

使用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-urlencodedjsonapplication/json,两者不仅 Content-Type 不同,数据格式和编码方式也不同。Poco 不提供自动序列化,得自己拼字符串或用 Poco::JSON::Object 生成内容再写入请求体流。

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

  • 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。

text=ZqhQzanResources