最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用HTTP庫和框架輕松發(fā)送HTTP請求

 更新時間:2023年12月25日 11:01:47   作者:Lion Long  
使用C++編程發(fā)送HTTP請求通常需要使用第三方的HTTP庫或框架,本文主要介紹了C++使用HTTP庫和框架輕松發(fā)送HTTP請求,感興趣的可以了解一下

一、引言

使用C++編程發(fā)送HTTP請求通常需要使用第三方的HTTP庫或框架。在C++中,有幾個受歡迎的HTTP庫可供選擇,例如Curl、Boost.Beast和cpp-httplib。另外,也可以自己實現(xiàn)socket來發(fā)送http請求。

二、使用Curl庫發(fā)送HTTP請求

(1)安裝Curl庫

對于Debian/Ubuntu系統(tǒng):

sudo apt-get install libcurl4-openssl-dev

對于RHEL/CentOS系統(tǒng):

sudo yum install libcurl-devel

對于macOS系統(tǒng):

brew install curl

(2)編寫Curl代碼。編寫一個C++代碼示例來使用Curl庫發(fā)送HTTP請求。將以下代碼保存為.cpp文件(例如curl.cpp)。

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

int main() {
    // 初始化Curl庫
    curl_global_init(CURL_GLOBAL_ALL);

    // 創(chuàng)建Curl句柄
    CURL* curl = curl_easy_init();
    if (!curl) {
        std::cerr << "Failed to initialize Curl." << std::endl;
        return 1;
    }

    // 設(shè)置請求的URL
    const char* url = "https://blog.csdn.net/Long_xu";

    // 設(shè)置Curl句柄的URL選項
    curl_easy_setopt(curl, CURLOPT_URL, url);

    // 發(fā)送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

然后,運行生成的可執(zhí)行文件:

./example

這里只是發(fā)送一個簡單的GET請求到指定的URL,并打印任何響應(yīng)數(shù)據(jù)。可以根據(jù)需要對代碼進行修改和擴展,例如設(shè)置請求頭、發(fā)送POST請求、處理響應(yīng)數(shù)據(jù)等。

三、使用Boost.Beast庫發(fā)送HTTP請求

(1)安裝Boost庫。前面有文章介紹了Boost庫的安裝,這里就不再贅述。

(2)編寫B(tài)oost.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() {
    // 創(chuàng)建Boost.Beast I/O上下文
    boost::asio::io_context ioc;

    // 創(chuàng)建TCP解析器
    boost::asio::ip::tcp::resolver resolver(ioc);

    // 解析主機名和端口
    boost::asio::ip::tcp::resolver::results_type endpoints =
        resolver.resolve("blog.csdn.net", "https");

    // 創(chuàng)建SSL上下文
    boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);

    // SSL連接
    boost::beast::ssl_stream<boost::asio::ip::tcp::socket> stream(ioc, ctx);

    // 連接到服務(wù)器
    boost::asio::connect(stream.next_layer(), endpoints.begin(), endpoints.end());

    // SSL握手
    stream.handshake(boost::asio::ssl::stream_base::client);

    // 創(chuàng)建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);

    // 發(fā)送HTTP請求
    http::write(stream, req);

    // 接收HTTP響應(yīng)
    boost::beast::flat_buffer buffer;
    http::response<http::dynamic_body> res;
    http::read(stream, buffer, res);

    // 打印響應(yīng)狀態(tài)碼和響應(yīng)體
    std::cout << "Response code: " << res.result_int() << std::endl;
    std::cout << "Response body: " << boost::beast::buffers_to_string(res.body().data()) << std::endl;

    // 關(guān)閉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

運行生成的可執(zhí)行文件:

./beast_example

四、使用cpp-httplib庫發(fā)送HTTP請求

(1)下載cpp-httplib庫源代碼。要從cpp-httplib的GitHub倉庫下載庫的源代碼:

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

(2)添加cpp-httplib庫和JSON庫的頭文件。將cpp-httplib存儲庫的include文件夾拷貝到項目文件夾中。確保項目結(jié)構(gòu)如下所示:

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

注意:cpp-httplib庫還需要JSON庫來處理JSON數(shù)據(jù)。需要下載并添加JSON庫。

(3)編寫cpp-httplib代碼。編寫一個使用cpp-httplib庫發(fā)送HTTP請求的示例代碼(例如httplib_example.cpp)。

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

int main() {
    // 創(chuàng)建httplib客戶端
    httplib::Client client("blog.csdn.net");

    // 發(fā)送GET請求
    auto response = client.Get("/Long_xu");

    // 檢查響應(yīng)
    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

運行生成的可執(zhí)行文件:

./httplib_example

五、自己實現(xiàn)socket發(fā)送 HTTP 請求

通過使用C++中的套接字(Socket)來發(fā)送HTTP請求的方式不具備第三方庫或框架那樣的功能和性能。

示例代碼:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string>

int main() {
    // 創(chuàng)建套接字
    int socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_desc == -1) {
        std::cerr << "Could not create socket." << std::endl;
        return 1;
    }

    // 設(shè)定服務(wù)器地址和端口
    std::string server = "192.168.1.101";
    int port = 80;
    
    // 解析服務(wù)器 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));

    // 設(shè)置服務(wù)器地址結(jié)構(gòu)
    struct sockaddr_in server_addr{};
    server_addr.sin_addr = address;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);

    // 連接服務(wù)器
    if (connect(socket_desc, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Could not connect to server." << std::endl;
        return 1;
    }

    // 構(gòu)建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";

    // 發(fā)送HTTP請求
    if (send(socket_desc, request.c_str(), request.length(), 0) < 0) {
        std::cerr << "Failed to send HTTP request." << std::endl;
        return 1;
    }

    // 接收并打印服務(wù)器響應(yīng)
    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;

    // 關(guān)閉套接字
    close(socket_desc);

    return 0;
}

總結(jié)

  • 在使用Boost.Beast庫發(fā)送HTTP請求時,步驟如下:

    安裝Boost庫。

    使用Boost.Beast庫的代碼發(fā)送HTTP請求。

  • 在使用cpp-httplib庫發(fā)送HTTP請求時,步驟如下:

    下載cpp-httplib庫源代碼。

    添加cpp-httplib庫和JSON庫的頭文件。

    使用cpp-httplib庫的代碼發(fā)送HTTP請求。

到此這篇關(guān)于C++使用HTTP庫和框架輕松發(fā)送HTTP請求的文章就介紹到這了,更多相關(guān)C++發(fā)送HTTP請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C++中鏈表操作實例分析

    C++中鏈表操作實例分析

    本文給大家分享了個人對于C++中鏈表操作的理解,并對具體實例進行了分析,是篇非常不錯的學習鏈表操作的文章,希望大家能夠喜歡
    2017-07-07
  • 詳解C語言中未定義行為

    詳解C語言中未定義行為

    C語言中的未定義行為是指程序執(zhí)行違反標準時,行為未指定的情況,未定義行為可能導致程序崩潰、數(shù)據(jù)損壞和不可預(yù)測的結(jié)果,下面就來介紹幾種常見未定義行為的例子,感興趣的可以了解一下
    2026-01-01
  • 詳解C++11中的線程庫

    詳解C++11中的線程庫

    線程是操作系統(tǒng)中的一個概念,線程對象可以關(guān)聯(lián)一個線程,用來控制線程以及獲取線程的狀態(tài),這篇文章主要介紹了C++11中的線程庫的相關(guān)知識,需要的朋友可以參考下
    2022-01-01
  • C++訪問注冊表獲取已安裝軟件信息列表示例代碼

    C++訪問注冊表獲取已安裝軟件信息列表示例代碼

    這篇文章主要介紹了c++通過讀取注冊表獲得本機已安裝軟件信息的方法,大家參考使用吧
    2013-11-11
  • 使用C語言實現(xiàn)動態(tài)數(shù)組Vector

    使用C語言實現(xiàn)動態(tài)數(shù)組Vector

    這篇文章主要為大家詳細介紹了使用C語言實現(xiàn)動態(tài)數(shù)組Vector的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • Visual?Studio?2022使用MinGW來編譯調(diào)試C/C++程序的圖文教程

    Visual?Studio?2022使用MinGW來編譯調(diào)試C/C++程序的圖文教程

    這篇文章主要介紹了Visual?Studio?2022使用MinGW來編譯調(diào)試C/C++程序,以實例來簡單介紹一下VS2022中如何使用MinGW來編譯、調(diào)試C/C++程序,需要的朋友可以參考下
    2022-08-08
  • C++淺拷貝與深拷貝及引用計數(shù)分析

    C++淺拷貝與深拷貝及引用計數(shù)分析

    這篇文章主要介紹了C++淺拷貝與深拷貝及引用計數(shù)分析的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 老生常談C++ explicit關(guān)鍵字

    老生常談C++ explicit關(guān)鍵字

    這篇文章主要介紹了C++ explicit關(guān)鍵字,explicit關(guān)鍵字只需用于類內(nèi)的單參數(shù)構(gòu)造函數(shù)前面,由于無參數(shù)的構(gòu)造函數(shù)和多參數(shù)的構(gòu)造函數(shù)總是顯式調(diào)用,這種情況在構(gòu)造函數(shù)前加explicit無意義,需要的朋友可以參考下
    2023-03-03
  • C/C++ 基礎(chǔ) 之回調(diào)函數(shù)示例詳解

    C/C++ 基礎(chǔ) 之回調(diào)函數(shù)示例詳解

    這篇文章主要介紹了C/C++ 基礎(chǔ) 之回調(diào)函數(shù)示例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • C語言實現(xiàn)哈夫曼樹的方法

    C語言實現(xiàn)哈夫曼樹的方法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)哈夫曼樹的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論

蛟河市| 特克斯县| 合作市| 宁波市| 北安市| 营口市| 张家港市| 吉水县| 霞浦县| 哈尔滨市| 蒙阴县| 灵丘县| 天全县| 舒兰市| 平昌县| 抚远县| 辰溪县| 都安| 巫溪县| 榆社县| 若尔盖县| 弋阳县| 中江县| 怀来县| 富裕县| 万年县| 巨野县| 社旗县| 乐昌市| 蕲春县| 通城县| 彭山县| 四会市| 金塔县| 栾城县| 开封市| 临武县| 九江市| 诸暨市| 司法| 班戈县|