CURL实现HTTP GET

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值