C++使用curl库进行http请求的方法详解

 更新时间:2023年07月03日 10:19:19   作者:超级大坏蛋2018  
这篇文章主要为大家详细介绍了C++如何使用curl库进行http请求,并且实现获取返回的头信息的时间,也就是获取后台服务的当前时间,感兴趣的可以了解一下

实现代码

#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;
}
 
// 将日期字符串转换为指定格式
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方法会将时间格式化为指定的格式,但是如果头部信息返回的时间如果不是北京时间,则可以修改方法修改为北京时间,如下:

// 将日期字符串转换为指定格式(北京时间)
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 结构转换为系统时钟的时间点
    std::chrono::system_clock::time_point tp = std::chrono::system_clock::from_time_t(std::mktime(&t));
 
    // 将时间点转换为北京时间
    std::chrono::hours offset(8); // 北京时间偏移量为+8小时
    tp += offset;
 
    // 转换为本地时间
    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() {
    // ...
}

知识补充

可能有小伙伴对于curl库不太熟悉,下面小编为大家简单介绍一下curl库的使用,需要的可以参考一下

关于Curl库

curl 是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl不但提供了一个可执行的工具库,还提供了供程序开发的libcurl库,该库使用c语言编写,支持跨平台。

编译安装

编译curl库很简单的,找到自己对应的VS目录,然后打开工程,选择所需要的版本即可编译。我使用的是VS2010的静态库版本,因此选择VC10目录->LIB Debug版本,然后编译,编译后生成libcurld.lib和对应的调试信息文件libcurld.pdb,这样我们开发调试的时候只需要把该库文件和curl库的头文件文件夹curl加到我们的工程里面就可以使用curl库给我们提供的功能了。不过需要注意的是,因为CURL的特殊性,需要预定义一些宏和添加特定的依赖库,如下所示:

// 需要定义的宏,要不然会提示找不到某些函数的定义
#define BUILDING_LIBCURL
//#define HTTP_ONLY
// 依赖库
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "libcurld.lib")

主要函数列表

1.全局初始化

CURLcode curl_global_init(long flags);

描述: 这个函数只能用一次(其实在调用curl_global_cleanup 函数后仍然可再用),如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动完成。

参数:flags

CURL_GLOBAL_ALL         //初始化所有的可能的调用。     

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

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

CURL_GLOBAL_NOTHING     //没有额外的初始化

2.全局清理

void curl_global_cleanup(void);

描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。

3.获取Curl版本库

char *curl_version();

描述: 打印当前libcurl库的版本。

4.初始化curl会话

CURL *curl_easy_init();

描述: curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样),相应的在调用结束时要用curl_easy_cleanup函数清理。一般curl_easy_init意味着一个会话的开始,它的返回值一般都用在easy系列的函数。

5.清理cur会话

void curl_easy_cleanup(CURL *handle);

描述: 这个调用用来结束一个会话,与curl_easy_init配合着用。

参数: CURL类型的指针。

6.设置curl会话参数

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

描述: 这个函数最重要了,几乎所有的curl程序都要频繁的使用它,用来设置参数。它告诉curl库,程序将有如何的行为,比如要查看一个网页的html代码等。

  • 参数handle:CURL类型的指针 
  • 参数option:各种CURLoption类型的选项。(都在curl.h库里有定义,man 也可以查看到)     
  • 参数parameter: 这个参数既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量,它用什么这取决于第二个参数。

7.执行curl会话

CURLcode curl_easy_perform(CURL *handle);

描述:这个函数在初始化CURL类型的指针以及curl_easy_setopt完成后调用,就像字面的意思所说perform就像是个舞台,让我们设置的option运作起来,执行curl所设置的动作。

到此这篇关于C++使用curl库进行http请求的方法详解的文章就介绍到这了,更多相关C++ curl进行http请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ rtti判断基类指针指向的真实对象类型

    c++ rtti判断基类指针指向的真实对象类型

    这篇文章主要为大家介绍了c++ 判断基类指针指向的真实对象类型示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • operator new在C++中的各种写法总结

    operator new在C++中的各种写法总结

    这篇文章并不是一个综合的手册,而是一个C++中各种内存分配方法的概述。它面向已经很熟悉C++语言的读者
    2013-09-09
  • C/C++通过SQLite SDK实现数据库增删改查操作

    C/C++通过SQLite SDK实现数据库增删改查操作

    SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级、零配置以及跨平台等特性而备受青睐,本文主要介绍了C++如何通过SQLite SDK实现数据库增删改查操作,感兴趣的可以了解下
    2023-11-11
  • C/C++实现通讯录管理系统(附源码)

    C/C++实现通讯录管理系统(附源码)

    这篇文章主要为大家详细介绍了如何利用C++实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-12-12
  • C++实现页面的缓冲区管理器

    C++实现页面的缓冲区管理器

    这篇文章主要介绍了C++实现页面的缓冲区管理器,文章围绕主题展开详细的内容介绍具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 使用VScode搭建ROS开发环境的教程详解

    使用VScode搭建ROS开发环境的教程详解

    这篇文章主要介绍了使用VScode搭建ROS开发环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 基于curses库实现弹球游戏

    基于curses库实现弹球游戏

    这篇文章主要为大家详细介绍了基于curses库实现弹球游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言数据结构进阶之栈和队列的实现

    C语言数据结构进阶之栈和队列的实现

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2021-11-11
  • C语言计算日期差的方法示例

    C语言计算日期差的方法示例

    这篇文章主要介绍了C语言计算日期差的方法,结合具体实例形式分析了C语言针对日期转换、运算等相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C语言调试手段:锁定错误的实现方法

    C语言调试手段:锁定错误的实现方法

    本篇文章是对在C语言调试中,锁定错误的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论