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

C++使用curl庫進(jìn)行http請求的方法詳解

 更新時(shí)間:2023年07月03日 10:19:19   作者:超級大壞蛋2018  
這篇文章主要為大家詳細(xì)介紹了C++如何使用curl庫進(jìn)行http請求,并且實(shí)現(xiàn)獲取返回的頭信息的時(shí)間,也就是獲取后臺服務(wù)的當(dāng)前時(shí)間,感興趣的可以了解一下

實(shí)現(xiàn)代碼

#include <iostream>
#include <string>
#include <curl/curl.h>
#include <ctime>
#include <iomanip>
 
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
    size_t totalSize = size * nmemb;
    output->append(static_cast<char*>(contents), totalSize);
    return totalSize;
}
 
// 將日期字符串轉(zhuǎn)換為指定格式
std::string formatDateString(const std::string& dateString) {
    std::tm t;
    std::istringstream iss(dateString);
    // 解析日期字符串
    iss >> std::get_time(&t, "%a, %d %b %Y %H:%M:%S %Z");
    if (iss.fail()) {
        return "";
    }
 
    std::ostringstream oss;
    // 格式化日期
    oss << std::put_time(&t, "%m%d%H%M%Y.%S");
    return oss.str();
}
 
int main() {
    CURL* curl;
    CURLcode res;
    std::string responseHeaders;
 
    curl_global_init(CURL_GLOBAL_DEFAULT);
 
    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://your-backend-server/current-time");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, &responseHeaders);
        curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
 
        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            std::cerr << "Failed to perform request: " << curl_easy_strerror(res) << std::endl;
        } else {
            std::string dateHeader = "Date: ";
            size_t startPos = responseHeaders.find(dateHeader);
            if (startPos != std::string::npos) {
                startPos += dateHeader.length();
                size_t endPos = responseHeaders.find("\r
", startPos);
                std::string dateString = responseHeaders.substr(startPos, endPos - startPos);
 
                std::string formattedDate = formatDateString(dateString);
                if (!formattedDate.empty()) {
                    std::cout << "Formatted date: " << formattedDate << std::endl;
                } else {
                    std::cerr << "Failed to format date string." << std::endl;
                }
            } else {
                std::cerr << "Failed to extract server time from response headers." << std::endl;
            }
        }
 
        curl_easy_cleanup(curl);
    }
 
    curl_global_cleanup();
 
    return 0;
}

formatdatestring方法會將時(shí)間格式化為指定的格式,但是如果頭部信息返回的時(shí)間如果不是北京時(shí)間,則可以修改方法修改為北京時(shí)間,如下:

// 將日期字符串轉(zhuǎn)換為指定格式(北京時(shí)間)
std::string formatDateString(const std::string& dateString) {
    std::tm t;
    std::istringstream iss(dateString);
    // 解析日期字符串
    iss >> std::get_time(&t, "%a, %d %b %Y %H:%M:%S %Z");
    if (iss.fail()) {
        return "";
    }
 
    // 將 tm 結(jié)構(gòu)轉(zhuǎn)換為系統(tǒng)時(shí)鐘的時(shí)間點(diǎn)
    std::chrono::system_clock::time_point tp = std::chrono::system_clock::from_time_t(std::mktime(&t));
 
    // 將時(shí)間點(diǎn)轉(zhuǎn)換為北京時(shí)間
    std::chrono::hours offset(8); // 北京時(shí)間偏移量為+8小時(shí)
    tp += offset;
 
    // 轉(zhuǎn)換為本地時(shí)間
    std::time_t tt = std::chrono::system_clock::to_time_t(tp);
    t = *std::localtime(&tt);
 
    std::ostringstream oss;
    // 格式化日期
    oss << std::put_time(&t, "%m%d%H%M%Y.%S");
    return oss.str();
}
 
int main() {
    // ...
}

知識補(bǔ)充

可能有小伙伴對于curl庫不太熟悉,下面小編為大家簡單介紹一下curl庫的使用,需要的可以參考一下

關(guān)于Curl庫

curl 是一個(gè)利用URL語法在命令行方式下工作的文件傳輸工具。它支持很多協(xié)議:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl不但提供了一個(gè)可執(zhí)行的工具庫,還提供了供程序開發(fā)的libcurl庫,該庫使用c語言編寫,支持跨平臺。

編譯安裝

編譯curl庫很簡單的,找到自己對應(yīng)的VS目錄,然后打開工程,選擇所需要的版本即可編譯。我使用的是VS2010的靜態(tài)庫版本,因此選擇VC10目錄->LIB Debug版本,然后編譯,編譯后生成libcurld.lib和對應(yīng)的調(diào)試信息文件libcurld.pdb,這樣我們開發(fā)調(diào)試的時(shí)候只需要把該庫文件和curl庫的頭文件文件夾curl加到我們的工程里面就可以使用curl庫給我們提供的功能了。不過需要注意的是,因?yàn)镃URL的特殊性,需要預(yù)定義一些宏和添加特定的依賴庫,如下所示:

// 需要定義的宏,要不然會提示找不到某些函數(shù)的定義
#define BUILDING_LIBCURL
//#define HTTP_ONLY
// 依賴庫
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "libcurld.lib")

主要函數(shù)列表

1.全局初始化

CURLcode curl_global_init(long flags);

描述: 這個(gè)函數(shù)只能用一次(其實(shí)在調(diào)用curl_global_cleanup 函數(shù)后仍然可再用),如果這個(gè)函數(shù)在curl_easy_init函數(shù)調(diào)用時(shí)還沒調(diào)用,它講由libcurl庫自動完成。

參數(shù):flags

CURL_GLOBAL_ALL         //初始化所有的可能的調(diào)用。     

CURL_GLOBAL_SSL         //初始化支持 安全套接字層。     

CURL_GLOBAL_WIN32       //初始化win32套接字庫。     

CURL_GLOBAL_NOTHING     //沒有額外的初始化

2.全局清理

void curl_global_cleanup(void);

描述:在結(jié)束libcurl使用的時(shí)候,用來對curl_global_init做的工作清理。類似于close的函數(shù)。

3.獲取Curl版本庫

char *curl_version();

描述: 打印當(dāng)前l(fā)ibcurl庫的版本。

4.初始化curl會話

CURL *curl_easy_init();

描述: curl_easy_init用來初始化一個(gè)CURL的指針(有些像返回FILE類型的指針一樣),相應(yīng)的在調(diào)用結(jié)束時(shí)要用curl_easy_cleanup函數(shù)清理。一般curl_easy_init意味著一個(gè)會話的開始,它的返回值一般都用在easy系列的函數(shù)。

5.清理cur會話

void curl_easy_cleanup(CURL *handle);

描述: 這個(gè)調(diào)用用來結(jié)束一個(gè)會話,與curl_easy_init配合著用。

參數(shù): CURL類型的指針。

6.設(shè)置curl會話參數(shù)

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

描述: 這個(gè)函數(shù)最重要了,幾乎所有的curl程序都要頻繁的使用它,用來設(shè)置參數(shù)。它告訴curl庫,程序?qū)⒂腥绾蔚男袨?,比如要查看一個(gè)網(wǎng)頁的html代碼等。

  • 參數(shù)handle:CURL類型的指針 
  • 參數(shù)option:各種CURLoption類型的選項(xiàng)。(都在curl.h庫里有定義,man 也可以查看到)     
  • 參數(shù)parameter: 這個(gè)參數(shù)既可以是個(gè)函數(shù)的指針,也可以是某個(gè)對象的指針,也可以是個(gè)long型的變量,它用什么這取決于第二個(gè)參數(shù)。

7.執(zhí)行curl會話

CURLcode curl_easy_perform(CURL *handle);

描述:這個(gè)函數(shù)在初始化CURL類型的指針以及curl_easy_setopt完成后調(diào)用,就像字面的意思所說perform就像是個(gè)舞臺,讓我們設(shè)置的option運(yùn)作起來,執(zhí)行curl所設(shè)置的動作。

到此這篇關(guān)于C++使用curl庫進(jìn)行http請求的方法詳解的文章就介紹到這了,更多相關(guān)C++ curl進(jìn)行http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java C++ 題解leetcode857雇傭K名工人最低成本vector pair

    Java C++ 題解leetcode857雇傭K名工人最低成本vector pair

    這篇文章主要為大家介紹了Java C++ 題解leetcode857雇傭K名工人最低成本vector pair示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • C++?多態(tài)虛函數(shù)的底層原理深入理解

    C++?多態(tài)虛函數(shù)的底層原理深入理解

    這篇文章主要介紹了C++?多態(tài)虛函數(shù)的底層原理深入理解,多態(tài)是在不同繼承關(guān)系的類對象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為,通常是父類調(diào)用子類的重寫函數(shù),在C++中就是?父類指針指向子類對象,此時(shí)父類指針的向下引用就可以實(shí)現(xiàn)多態(tài)
    2022-08-08
  • VS Studio控制臺中文輸出亂碼問題分析及解決過程

    VS Studio控制臺中文輸出亂碼問題分析及解決過程

    文章主要講述了解決從txt文件讀取內(nèi)容時(shí)出現(xiàn)中文亂碼的問題,首先查看控制臺輸出的編碼格式,然后將txt文件轉(zhuǎn)換為與控制臺相同的編碼格式,之后中文亂碼問題即可解決
    2026-04-04
  • C++ new、delete(new[]、delete[])操作符重載需要注意的問題

    C++ new、delete(new[]、delete[])操作符重載需要注意的問題

    這篇文章主要介紹了C++ new、delete(new[]、delete[])操作符重載需要注意的問題,本文同時(shí)講解了兼容默認(rèn)的 new、delete 的錯(cuò)誤處理方式、多態(tài)的問題等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 如何通過C++求出鏈表中環(huán)的入口結(jié)點(diǎn)

    如何通過C++求出鏈表中環(huán)的入口結(jié)點(diǎn)

    本文主要介紹了通過C++求解鏈表中環(huán)的入口結(jié)點(diǎn),即給一個(gè)長度為n鏈表,若其中包含環(huán),請找出該鏈表的環(huán)的入口結(jié)點(diǎn),否則,返回null。需要的朋友可以參考一下
    2021-12-12
  • Qt常用容器類的使用

    Qt常用容器類的使用

    本文主要介紹了Qt常用容器類的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 一文詳解C++中的轉(zhuǎn)換構(gòu)造函數(shù)

    一文詳解C++中的轉(zhuǎn)換構(gòu)造函數(shù)

    在 C/C++ 中,不同的數(shù)據(jù)類型之間可以相互轉(zhuǎn)換,無需用戶指明如何轉(zhuǎn)換的稱為自動類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換),需要用戶顯式地指明如何轉(zhuǎn)換的稱為強(qiáng)制類型轉(zhuǎn)換,本文就給大家詳細(xì)介紹一下C++的轉(zhuǎn)換構(gòu)造函數(shù),需要的朋友可以參考下
    2023-09-09
  • c++ 臨時(shí)對象的來源

    c++ 臨時(shí)對象的來源

    大家可能對這個(gè)臨時(shí)對象這個(gè)概念還不是很清楚,那么首先我們花一些時(shí)間來理解臨時(shí)對象
    2013-01-01
  • C語言中不定參數(shù)?...?的語法以及函數(shù)封裝

    C語言中不定參數(shù)?...?的語法以及函數(shù)封裝

    不定參數(shù)是指函數(shù)可以接收不確定個(gè)數(shù)的參數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言中不定參數(shù)?...?的語法以及函數(shù)封裝的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 深入理解C語言的邏輯控制

    深入理解C語言的邏輯控制

    這篇文章主要介紹了C語言的邏輯控制,對C語言的邏輯控制有較為深入的剖析,需要的朋友可以參考下
    2014-07-07

最新評論

娄烦县| 江油市| 宁明县| 淮南市| 织金县| 佛冈县| 青冈县| 浑源县| 新源县| 蕉岭县| 巴南区| 瑞昌市| 台北市| 鄄城县| 威远县| 灌云县| 巴青县| 集贤县| 渭源县| 韶山市| 乌恰县| 政和县| 高唐县| 长沙县| 安西县| 南宫市| 南安市| 西华县| 大足县| 随州市| 凤翔县| 土默特左旗| 沭阳县| 西安市| 新蔡县| 长乐市| 闸北区| 行唐县| 崇信县| 罗甸县| 烟台市|