#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "curl/curl.h"
#pragma comment(lib, "libcurl.lib")
// 回调函数,用于处理libcurl接收到的数据
size_t OnRecvHttpGetData(void* contents, size_t size, size_t count, void* userParam)
{
size_t realsize = size * count; // 计算实际接收到的数据大小
std::string *pstr = (std::string*)userParam;
// 将接收到的数据复制到缓冲区中
(*pstr).append((char*)contents, realsize/sizeof(char));
// 返回接收到的数据大小,以便libcurl知道已经处理了多少数据
return realsize;
}
bool curlHttpGet(CURL *curl, const char *url, std::string &strRecv)
{
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
// 设置要访问的URL(HTTP GET请求的URL)
curl_easy_setopt(curl, CURLOPT_URL, url);
// 自动重定向
//curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
// 设置回调函数,用于处理接收到的响应数据
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnRecvHttpGetData);
// 设置响应数据存储的缓冲区
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strRecv);
struct curl_slist *headers = NULL;
// 可选项
{
// 设置总超时
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 3000L);
// 设置连接超时
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000L);
// 响应头
headers = curl_slist_append(headers, "Content-Type: text/xml");
headers = curl_slist_append(headers, "Accept: text/xml");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
// 执行HTTP GET请求并等待响应
CURLcode res = curl_easy_perform(curl);
curl_slist_free_all(headers);
if (res == CURLE_OPERATION_TIMEDOUT)
{
fprintf(stderr, "curl_easy_perform() failed: timeout\n");
return false;
}
else if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
return false;
}
else
{
return true;
}
}
int main(void) {
CURL *curl;
const char *url = "http://www.baidu.com";
// 初始化libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
std::string strRecv;
if (!curlHttpGet(curl, url, strRecv))
{
std::cout << "curlHttpGet Failed!" << std::endl;
}
else
{
std::cout << "curlHttpGet Success!" << std::endl;
}
// 清理资源
curl_easy_cleanup(curl);
curl_global_cleanup();
// 数据存储到文件
FILE *fp = fopen("httpget.txt", "wb");
if (fp)
{
fwrite(strRecv.c_str(), 1, strRecv.size(), fp);
fclose(fp);
}
getchar();
return 0;
}
CURL实现HTTP GET
于 2024-10-23 16:11:23 首次发布