C++使用HTTP库和框架轻松发送HTTP请求

 更新时间:2023年12月25日 11:01:47   作者:Lion Long  
使用C++编程发送HTTP请求通常需要使用第三方的HTTP库或框架,本文主要介绍了C++使用HTTP库和框架轻松发送HTTP请求,感兴趣的可以了解一下

一、引言

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

二、使用Curl库发送HTTP请求

(1)安装Curl库

对于Debian/Ubuntu系统:

sudo apt-get install libcurl4-openssl-dev

对于RHEL/CentOS系统:

sudo yum install libcurl-devel

对于macOS系统:

brew install curl

(2)编写Curl代码。编写一个C++代码示例来使用Curl库发送HTTP请求。将以下代码保存为.cpp文件(例如curl.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://blog.csdn.net/Long_xu";

    // 设置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;
}

(3)编译和运行代码

g++ curl.cpp -lcurl -o example

然后,运行生成的可执行文件:

./example

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

三、使用Boost.Beast库发送HTTP请求

(1)安装Boost库。前面有文章介绍了Boost库的安装,这里就不再赘述。

(2)编写Boost.Beast代码。比如beast_example.cpp

#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("blog.csdn.net", "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, "/Long_xu", 11);
    req.set(http::field::host, "blog.csdn.net");
    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;
}

步骤 3: 编译和运行代码

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

运行生成的可执行文件:

./beast_example

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

(1)下载cpp-httplib库源代码。要从cpp-httplib的GitHub仓库下载库的源代码:

git clone https://github.com/yhirose/cpp-httplib.git

(2)添加cpp-httplib库和JSON库的头文件。将cpp-httplib存储库的include文件夹拷贝到项目文件夹中。确保项目结构如下所示:

——project_folder/
  ├─ cpp-httplib/
  │   └─ include/
  │       ├─ httplib.h
  │       └─ (其他cpp-httplib头文件)
  └─ your_files.cpp

注意:cpp-httplib库还需要JSON库来处理JSON数据。需要下载并添加JSON库。

(3)编写cpp-httplib代码。编写一个使用cpp-httplib库发送HTTP请求的示例代码(例如httplib_example.cpp)。

#include <iostream>
#include <httplib.h>

int main() {
    // 创建httplib客户端
    httplib::Client client("blog.csdn.net");

    // 发送GET请求
    auto response = client.Get("/Long_xu");

    // 检查响应
    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;
}

(4)编译和运行代码

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

运行生成的可执行文件:

./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;
}

总结

  • 在使用Boost.Beast库发送HTTP请求时,步骤如下:

    安装Boost库。

    使用Boost.Beast库的代码发送HTTP请求。

  • 在使用cpp-httplib库发送HTTP请求时,步骤如下:

    下载cpp-httplib库源代码。

    添加cpp-httplib库和JSON库的头文件。

    使用cpp-httplib库的代码发送HTTP请求。

到此这篇关于C++使用HTTP库和框架轻松发送HTTP请求的文章就介绍到这了,更多相关C++发送HTTP请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C++ 读写文件安全又简洁的简单实例

    C++ 读写文件安全又简洁的简单实例

    这篇文章主要介绍了C++ 读写文件安全又简洁的简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • C/C++中extern函数使用详解

    C/C++中extern函数使用详解

    extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定
    2022-09-09
  • C语言基础指针详解教程

    C语言基础指针详解教程

    此处对于指针做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家给予支持
    2021-11-11
  • 详解C++ functional库中的仿函数使用方法

    详解C++ functional库中的仿函数使用方法

    仿函数(functor)又称之为函数对象(function object),实际上就是 重载了()操作符 的 struct或class。本文将详细讲解C++中仿函数的使用方法,需要的可以参考一下
    2022-04-04
  • C语言判断字符串是否回文三种方法实例

    C语言判断字符串是否回文三种方法实例

    回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的,下面这篇文章主要给大家介绍了关于C语言判断字符串是否回文的三种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 基于C语言代码实现扫雷游戏

    基于C语言代码实现扫雷游戏

    这篇文章主要为大家详细介绍了基于C语言代码实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C语言实现无规律数据加密、解密功能

    C语言实现无规律数据加密、解密功能

    这篇文章主要为大家详细介绍了C语言实现无规律数据加密、解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C语言数据结构之队列算法详解

    C语言数据结构之队列算法详解

    这篇文章介绍了C语言数据结构之队列的算法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C++中形参和实参的区别及说明

    C++中形参和实参的区别及说明

    这篇文章主要介绍了C++中形参和实参的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 使用C语言打印月历

    使用C语言打印月历

    这篇文章主要为大家详细介绍了使用C语言打印月历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论