C++ HTTP客户端:正确发送请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么要在C++中编写HTTP客户端?

在现代开发中,与Web服务的交互已成为几乎所有应用程序不可或缺的一部分。即使您正在用C++编写桌面程序,迟早也需要向服务器发送数据或从服务器获取数据。与脚本语言不同,C++没有内置的HTTP处理工具——但这并不是问题。有几种经过验证的方法可以在C++中实现HTTP客户端,我们将由浅入深地逐一介绍。

在本文中,我们将讨论:

  • 如何使用libcurl库——C++中处理HTTP的黄金标准
  • 如何发送带有标头和正文的GET和POST请求
  • 如何处理收到的响应并解析JSON
  • 如何避免处理网络请求时的常见错误

所有代码示例都可以直接用于您的项目。让我们开始吧!



1. 库的选择:libcurl作为主要工具

从头开始用C++编写HTTP客户端是一项吃力不讨好的任务。您需要处理套接字、手动构建标头、解析响应以及处理大量边界情况。幸运的是,有libcurl——一个强大、稳定且跨平台的库,它为您完成了所有繁重的工作。

首先,安装libcurl。在Ubuntu上,只需一条命令即可完成:

sudo apt-get install libcurl4-openssl-dev

在Windows上,您可以使用vcpkg或下载预编译的二进制文件。安装后,在您的CMakeLists.txt中链接该库,或者直接手动使用-lcurl标志进行链接。

使用libcurl的基本结构始终相同:

  1. 通过调用curl_global_init()初始化全局上下文
  2. 通过curl_easy_init()创建会话句柄
  3. 设置请求参数(URL、标头、方法等)
  4. 通过curl_easy_perform()执行请求
  5. 清理资源

听起来很简单?让我们来看代码。



2. 发送GET和POST请求:实践示例

2.1 简单的GET请求

我们从经典开始——从公共API获取数据。假设我们想了解比特币兑美元的当前汇率:

#include <iostream>#include <string>#include <curl/curl.h>

// 用于将数据写入字符串的回调函数static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}

int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); std::string response; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://api.coindesk.com/v1/bpi/currentprice.json"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { std::cerr << "错误: " << curl_easy_strerror(res) << std::endl; } else { std::cout << "服务器响应:" << response << std::endl; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0;}

请注意回调函数WriteCallback。libcurl不知道将数据存储在哪里,因此我们传递一个指向字符串的指针,并在数据到达时写入其中。这是标准模式。



2.2 带JSON正文的POST请求

现在,让我们向服务器发送数据。假设我们正在注册一个用户:

#include <iostream>#include <string>#include <curl/curl.h>

int main() { curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_

博客

书籍推荐