c++ curl使用ip4_C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装

#include "CommonTools.h"using namespace std;size_t CommonTools::receive_data(void *contents, size_t size, size_t nmemb,void *stream){

string *str= (string*)stream; (*str).append((char*)contents, size*nmemb); return size * nmemb;}

size_t CommonTools::writedata2file(void *ptr, size_t size, size_t nmemb,FILE *stream) {

size_t written= fwrite(ptr, size, nmemb, stream); return written;}

int CommonTools::download_file(const char* url, const char outfilename[FILENAME_MAX]){

CURL *curl; FILE *fp; CURLcode res;/* 调用curl_global_init()初始化libcurl */

res= curl_global_init(CURL_GLOBAL_ALL); if (CURLE_OK !=res)

{

printf("init libcurl failed."); curl_global_cleanup(); return -1;}

/* 调用curl_easy_init()函数得到 easy interface型指针 */

curl= curl_easy_init();if (curl) {

fp= fopen(outfilename,"wb");/* 调用curl_easy_setopt()设置传输选项 */

res= curl_easy_setopt(curl, CURLOPT_URL, url); if (res !=CURLE_OK)

{

fclose(fp); curl_easy_cleanup(curl); return -1;}

/* 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务 */

res= curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CommonTools::writedata2file); if (res !=CURLE_OK){

fclose(fp); curl_easy_cleanup(curl); return -1;}

/* 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务 */

res= curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); if (res !=CURLE_OK)

{

fclose(fp); curl_easy_cleanup(curl); return -1;}

res= curl_easy_perform(curl);// 调用curl_easy_perform()函数完成传输任务

fclose(fp);/* Check for errors */

if(res !=CURLE_OK){

fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res)); curl_easy_cleanup(curl); return -1;}

/* always cleanup */

curl_easy_cleanup(curl);// 调用curl_easy_cleanup()释放内存

}

curl_global_cleanup(); return 0;}

CURLcode CommonTools::HttpGet(const std::string & strUrl, std::string & strResponse,int nTimeout){

CURLcode res; CURL* pCURL = curl_easy_init();if (pCURL==NULL) {

return CURLE_FAILED_INIT;}

curl_easy_setopt(pCURL, CURLOPT_URL, strUrl.c_str()); //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(pCURL, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(pCURL, CURLOPT_TIMEOUT, nTimeout); curl_easy_setopt(pCURL, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(pCURL, CURLOPT_WRITEFUNCTION, CommonTools::receive_data); curl_easy_setopt(pCURL, CURLOPT_WRITEDATA, (void*)&strResponse); res = curl_easy_perform(pCURL); curl_easy_cleanup(pCURL); return res;}

CURLcode CommonTools::HttpPost(const std::string & strUrl, std::string szJson,std::string & strResponse,int nTimeout){

CURLcode res; char szJsonData[1024]; memset(szJsonData, 0, sizeof(szJsonData)); strcpy(szJsonData, szJson.c_str()); CURL* pCURL = curl_easy_init(); struct curl_slist* headers = NULL; if (pCURL ==NULL) {

return CURLE_FAILED_INIT;}

CURLcode ret; ret = curl_easy_setopt(pCURL, CURLOPT_URL, strUrl.c_str());// std::cout << ret << std::endl;ret= curl_easy_setopt(pCURL, CURLOPT_POST, 1L); headers = curl_slist_append(headers,"content-type:application/json");ret= curl_easy_setopt(pCURL, CURLOPT_HTTPHEADER, headers);ret= curl_easy_setopt(pCURL, CURLOPT_POSTFIELDS, szJsonData); //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); ret = curl_easy_setopt(pCURL, CURLOPT_TIMEOUT, nTimeout);ret= curl_easy_setopt(pCURL, CURLOPT_WRITEFUNCTION, CommonTools::receive_data);ret= curl_easy_setopt(pCURL, CURLOPT_WRITEDATA, (void*)&strResponse);res= curl_easy_perform(pCURL); curl_easy_cleanup(pCURL); return res;}

C++ 中,你可以使用 libcurl 库来进行 HTTP 请求,包括 POST 请求,并附加 `If-None-Match` 头部信息。首先,你需要安装 libcurl,然后在代码中包含必要的库文件并设置相应的选项。以下是一个基本的例子: ```cpp #include <curl/curl.h> size_t write_function(void *ptr, size_t size, size_t nmemb, std::string* data) { data->append((char*)ptr, size * nmemb); return size * nmemb; } CURLcode send_post_request(const char* url, const std::string& if_none_match, std::string* response) { CURL* curl = curl_easy_init(); if (!curl) { // 初始化失败的错误处理 return CURLE_FAILED_INIT; } curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_function); // 设置回调函数来接收服务器响应 curl_slist* headers = NULL; headers = curl_slist_append(headers, "If-None-Match: " + if_none_match.c_str()); // 添加 If-None-Match 头 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 设置HTTP头 // 如果你想发送POST数据,可以这样做: struct curl_formfield field; field.name = "key"; field.value = "value"; // 替换为你实际的POST参数 field.options = CURLFORM_COPYNAME | CURLFORM_FILE | CURLFORM_BUFFERED; // 根据需要调整选项 curl_slist* post_fields = curl_slist_append(NULL, curl_httppost(&field)); curl_easy_setopt(curl, CURLOPT_HTTPPOST, post_fields); CURLcode res = curl_easy_perform(curl); curl_slist_free_all(headers); curl_easy_cleanup(curl); if (res != CURLE_OK) { // 处理错误 return res; } response->clear(); // 清空之前的内容,以便保存新的响应 return CURLE_OK; } // 使用示例 std::string if_none_match_value = "your-if-none-match-value"; std::string response_buffer; send_post_request("http://example.com/api", if_none_match_value, &response_buffer);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值