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

 更新时间:2024年04月03日 09:25:42   作者:Bossking321  
使用C++编程发送HTTP请求通常需要使用第三方的HTTP库或框架,在C++中,有几个受欢迎的HTTP库可供选择,例如Curl、Boost.Beast和cpp-httplib,另外,也可以自己实现socket来发送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;
    }
 
    // 设置请求的URL
    const 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;
}

以上就是C++中发送HTTP请求的实现方式的详细内容,更多关于C++发送HTTP请求的资料请关注脚本之家其它相关文章!

相关文章

  • C语言新手入门速通手册

    C语言新手入门速通手册

    C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用
    2022-04-04
  • C语言中.与->的区别详细解析

    C语言中.与->的区别详细解析

    这篇文章主要给大家介绍了关于C语言中.与->区别的相关资料,这虽然是个小问题,但有时候很容易让人迷惑,因为有的时候用混淆了,程序编译不通过,需要的朋友可以参考下
    2023-06-06
  • C++实现比较日期大小的示例代码

    C++实现比较日期大小的示例代码

    这篇文章主要为大家详细介绍了如何使用C++实现比较日期大小的功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-04-04
  • C++移动操作,RVO和NRVO详细

    C++移动操作,RVO和NRVO详细

    本文将讨论了何时C++会自动进行移动操作,并且说明了复制消除,RVO和NRVO优的化等香瓜吧资料,需要的小伙伴可以参考一下
    2021-09-09
  • C++实现简易计算器功能

    C++实现简易计算器功能

    这篇文章主要为大家详细介绍了C++实现简易计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Qt实现简单五子棋小游戏

    Qt实现简单五子棋小游戏

    这篇文章主要为大家详细介绍了Qt实现简单五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C++常用的#include头文件总结

    C++常用的#include头文件总结

    这篇文章主要介绍了C++常用的#include头文件,对初学者理解C++程序设计大有好处的相关资料
    2014-07-07
  • 利用Matlab制作三子棋游戏的示例代码

    利用Matlab制作三子棋游戏的示例代码

    三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。本文将用Matlab制作这一经典游戏,感兴趣的可以试一试
    2022-03-03
  • 利用Matlab绘制好看的旋转九边形

    利用Matlab绘制好看的旋转九边形

    这篇文章主要为大家介绍了如何利用Matlab绘制超好看的旋转九边形。文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-03-03
  • C语言中几种常量的认识和理解

    C语言中几种常量的认识和理解

    这篇文章主要为大家介绍了C语言常量的认识和理解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论