免费资源网,https://freexyz.cn/
目录
  • 一、简介
  • 二、使用Curl库发送HTTP请求
    • 1. 确认当前系统是什么系统
    • 2.linux环境中如何确认是否安装过libcurl
    • 3.安装Curl库
    • 4.编写Curl代码
    • 5.编译
  • 三、编写Boost.Beast代码
    • 四、使用cpp-httplib库发送HTTP请求
      • 五、自己实现socket发送 HTTP 请求

        一、简介

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

        二、使用Curl库发送HTTP请求

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

        查看版本信息   

        cat /etc/os-release

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

        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方法

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

        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安装

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

        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请求的资料请关注其它相关文章!

        免费资源网,https://freexyz.cn/
        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。