C++中发送HTTP请求的方式

一,简介

        使用C++编程发送HTTP请求通常需要使用第三方的HTTP库或框架。在C++中,有几个受欢迎的HTTP库可供选择,例如Curl、Boost.Beast和cpp-httplib。另外,也可以自己实现socket来发送http请求

二、使用Curl库发送HTTP请求

1. 确认当前系统是什么系统

 查看版本信息   

cat /etc/os-release

2.linux环境中如何确认是否安装过libcurl

        1> 使用dpkg(适用于Debian/Ubuntu系统):

dpkg -l | grep libcurl

        2> 使用rpm(适用于Red Hat/CentOS系统):

rpm -qa | grep libcurl

        3>  使用yum(适用于CentOS/Red Hat系统,用于检查是否安装,不显示版本):

yum list installed | grep libcurl

        4> 使用apt-get(适用于Debian/Ubuntu系统,用于检查是否安装,不显示版本):

apt-get install libcurl

我使用的是yum方法

3.安装Curl库

        a> 对于Debian/Ubuntu系统:

sudo apt-get install libcurl4-openssl-dev

        b> 对于RHEL/CentOS系统:

sudo yum install libcurl-devel

        c> 对于macOS系统:

brew install curl

使用yum安装

4.编写Curl代码

编写一个C++代码示例来使用Curl库发送HTTP请求。将以下代码保存为.cpp文件

#include <iostream>
#include <curl/curl.h>int main() 
{// 初始化Curl库curl_global_init(CURL_GLOBAL_ALL);// 创建Curl句柄CURL* curl = curl_easy_init();if (!curl) {std::cerr << "Failed to initialize Curl." << std::endl;return 1;}// 设置请求的URLconst char* url = "https://www.test.com";// 设置Curl句柄的URL选项curl_easy_setopt(curl, CURLOPT_URL, url);// 发送GET请求CURLcode res = curl_easy_perform(curl);if (res != CURLE_OK) {std::cerr << "Failed to send HTTP request: " << curl_easy_strerror(res) << std::endl;curl_easy_cleanup(curl);curl_global_cleanup();return 1;}// 清理Curl句柄和Curl库curl_easy_cleanup(curl);curl_global_cleanup();return 0;
}

5.编译

g++ curl.cpp -lcurl -o example

        这里只是发送一个简单的GET请求到指定的URL,并打印任何响应数据。可以根据需要对代码进行修改和扩展,例如设置请求头、发送POST请求、处理响应数据等。

三,编写Boost.Beast代码

        这里暂时不做boost库安装的介绍

        简单的使用,如下:

#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <iostream>namespace http = boost::beast::http;int main() {// 创建Boost.Beast I/O上下文boost::asio::io_context ioc;// 创建TCP解析器boost::asio::ip::tcp::resolver resolver(ioc);// 解析主机名和端口boost::asio::ip::tcp::resolver::results_type endpoints =resolver.resolve("www.test.com", "https");// 创建SSL上下文boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);// SSL连接boost::beast::ssl_stream<boost::asio::ip::tcp::socket> stream(ioc, ctx);// 连接到服务器boost::asio::connect(stream.next_layer(), endpoints.begin(), endpoints.end());// SSL握手stream.handshake(boost::asio::ssl::stream_base::client);// 创建HTTP请求http::request<http::string_body> req(http::verb::get, "/Login", 11);req.set(http::field::host, "www.test.com");req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);// 发送HTTP请求http::write(stream, req);// 接收HTTP响应boost::beast::flat_buffer buffer;http::response<http::dynamic_body> res;http::read(stream, buffer, res);// 打印响应状态码和响应体std::cout << "Response code: " << res.result_int() << std::endl;std::cout << "Response body: " << boost::beast::buffers_to_string(res.body().data()) << std::endl;// 关闭SSL连接boost::beast::error_code ec;stream.shutdown(ec);// 如果有错误,打印错误信息if (ec && ec != boost::asio::error::eof) {std::cerr << "Error: " << ec.message() << std::endl;return 1;}return 0;
}

编译:

g++ beast_example.cpp -o beast_example -lboost_system -lboost_filesystem -lboost_thread -lboost_iostreams -lssl -lcrypto

四,使用cpp-httplib库发送HTTP请求

下载cpp-httplib库源代码。要从cpp-httplib的GitHub仓库下载库的源代码:
源码库地址:https://github.com/yhirose/cpp-httplib

编写cpp-httplib代码。编写一个使用cpp-httplib库发送HTTP请求的示例代码:

#include <iostream>
#include <httplib.h>int main() {// 创建httplib客户端httplib::Client client("www.test.com");// 发送GET请求auto response = client.Get("/Login");// 检查响应if (response && response->status == 200) {std::cout << "Response body: " << response->body << std::endl;} else {std::cerr << "Failed to send HTTP request." << std::endl;return 1;}return 0;
}

编译:

g++ httplib_example.cpp -std=c++11 -o httplib_example

五,自己实现socket发送 HTTP 请求

        通过使用C++中的套接字(Socket)来发送HTTP请求的方式不具备第三方库或框架那样的功能和性能。

        代码示例:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string>int main() {// 创建套接字int socket_desc = socket(AF_INET, SOCK_STREAM, 0);if (socket_desc == -1) {std::cerr << "Could not create socket." << std::endl;return 1;}// 设定服务器地址和端口std::string server = "192.168.1.101";int port = 80;// 解析服务器 IP 地址struct hostent* host = gethostbyname(server.c_str());if (host == nullptr) {std::cerr << "Could not resolve hostname." << std::endl;return 1;}struct in_addr address;memcpy(&address, host->h_addr_list[0], sizeof(struct in_addr));// 设置服务器地址结构struct sockaddr_in server_addr{};server_addr.sin_addr = address;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(port);// 连接服务器if (connect(socket_desc, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Could not connect to server." << std::endl;return 1;}// 构建HTTP请求std::string request ="GET /endpoint HTTP/1.1\r\n""Host: " + server + "\r\n""User-Agent: C++ HTTP Client\r\n""Connection: close\r\n\r\n";// 发送HTTP请求if (send(socket_desc, request.c_str(), request.length(), 0) < 0) {std::cerr << "Failed to send HTTP request." << std::endl;return 1;}// 接收并打印服务器响应std::string response;char buffer[4096];while (true) {memset(buffer, 0, sizeof(buffer));int bytes_received = recv(socket_desc, buffer, sizeof(buffer) - 1, 0);if (bytes_received <= 0) {break;}response += buffer;}std::cout << response << std::endl;// 关闭套接字close(socket_desc);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587829.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…

【C++】哈希之位图

目录 一、位图概念二、海量数据面试题 一、位图概念 假如有40亿个无重复且没有排序的无符号整数&#xff0c;给一个无符号整数&#xff0c;如何判断这个整数是否在这40亿个数中&#xff1f; 我们用以前的思路有这些&#xff1a; 把这40亿个数遍历一遍&#xff0c;直到找到为…

4月2号总结

java学习 一.final关键字 final英语翻译过来的意思是“最后&#xff0c;最终”的意思。 在java中&#xff0c;final有三个作用&#xff0c;修饰变量、修饰类、修饰成员方法。 1.修饰变量 final修饰的变量只能被赋值一次&#xff0c;不能被改变。 要是强行去改变final修饰…

服务器端口被扫会发生哪些故障?

在数字化时代&#xff0c;服务器作为支撑各种业务运行的核心基础设施&#xff0c;其安全性至关重要。然而&#xff0c;当服务器的端口被恶意扫描时&#xff0c;可能会引发一系列故障&#xff0c;给企业和个人带来不可估量的损失。那么&#xff0c;服务器端口被扫会发生哪些故障…

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…

vue3项目运行正常但vscode红色波浪线报错

以下解决办法如不生效&#xff0c;可尝试 重启 vscode 一、Vetur插件检测问题 vetur 是一个 vscode 插件&#xff0c;用于为 .vue 单文件组件提供代码高亮以及语法支持。但 vue 以及 vetur 对于 ts 的支持&#xff0c;并不友好。 1、原因 如下图&#xff1a;鼠标放到红色波浪…

负载均衡集群

一、集群的基本原理 集群&#xff1a;数据内容是一致的&#xff0c;集群可以被替代 分布式&#xff1a;各司其职&#xff0c;每台服务器存储自己独有的数据&#xff0c;对外作为单点被访问是访问整体的数据&#xff1b; 分布式是不能被替代的&#xff1b;分布式分为MFS、GFS、…

Spring Boot | Spring Boot “整合JPA“

目录 &#xff1a; 一、Spring Data JPA”介绍“二、Spring Data JPA”要进行的操作“ :① 编写ORM “实体类” ( 编写“数据库表”对应的“实体类” 配置“映射关系”的“注解”)② 编写 Repository 接口 ( 继承“JpaRepository接口” 其中的“操作数据库”的方法 通过“注…

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后&#xff0c;把下面的任务栏删除&#xff0c;把上面的任务栏移到下面&#xff0c;然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…

拥塞控制算法系列之:Swift-谷歌2020年SIGCOM-包级别端到端TIMELY拥塞控制算法

核心要点&#xff1a; 谷歌 2020 SIGCOM基于delay的AIMD拥塞拆分EC和FC&#xff0c;时延敏感场景优势分别计算EC和FC的wnd&#xff08;最核心&#xff09;保障吞吐和低延迟。Swift 因利用延迟的简单性和有效性而闻名包级别的论文&#xff1a;https://dl.acm.org/doi/pdf/10.11…

【25考研】:四川大学计算机学院24届874考研考情分析

去年的考情分析也是我做的&#xff0c; 今年就在去年的基础上做了。保持形式不变&#xff0c;更改数据。 21考情&#xff1a; 万载月寒肠断客&#xff1a;四川大学计算机学院21届CS考研考情分析 22考情&#xff1a; 懒羊羊&#xff1a;四川大学计算机学院2022考研考情分析 2…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…