想用c++发送http_post请求,用到了libcurl。
想将其包装一下,因为默认http的响应结果是打印到stdout的,如果想将响应结果另外处理,需要自己定义一个callback函数。
考虑到我们想将功能包装起来,一个callback函数放到外面不太好,所以考虑使用lambda表达式。
以下是可以使用的形式:
#include <stdio.h>
#include <curl/curl.h>
#include <iostream> using namespace std; string http_post(string url, string postdata) {
CURL *curl;
CURLcode res;
string result;
typedef size_t (*curl_write_callback)(char * buffer, size_t size,
size_t nitems, string * outstream); auto writer = [](char * buffer,size_t size,size_t nitems,string * outstream)
->size_t {
if(outstream==NULL)
{
return ;
}
outstream->append(buffer,size*nitems);
return size*nitems;
}; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,
(curl_write_callback)writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
res = curl_easy_perform(curl);
if (res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
//cout << "buffer:" << result << endl;
curl_global_cleanup();
return result;
}
注意到,我们将writer作为参数的时候做了一次强制类型转换。之前没有这个强制类型转换,程序会退出,并返回-1