实现代码
#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所设置的动作。