想用c++发送http_post请求,用到了libcurl。
想将其包装一下,因为默认http的响应结果是打印到stdout的,如果想将响应结果另外处理,需要自己定义一个callback函数。
考虑到我们想将功能包装起来,一个callback函数放到外面不太好,所以考虑使用lambda表达式。
以下是可以使用的形式:
1 #include <stdio.h> 2 #include <curl/curl.h> 3 #include <iostream> 4 5 using namespace std; 6 7 string http_post(string url, string postdata) { 8 CURL *curl; 9 CURLcode res; 10 string result; 11 typedef size_t (*curl_write_callback)(char * buffer, size_t size, 12 size_t nitems, string * outstream); 13 14 auto writer = [](char * buffer,size_t size,size_t nitems,string * outstream) 15 ->size_t { 16 if(outstream==NULL) 17 { 18 return 0; 19 } 20 outstream->append(buffer,size*nitems); 21 return size*nitems; 22 }; 23 24 curl_global_init(CURL_GLOBAL_ALL); 25 26 curl = curl_easy_init(); 27 if (curl) { 28 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 29 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str()); 30 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, 31 (curl_write_callback)writer); 32 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result); 33 res = curl_easy_perform(curl); 34 if (res != CURLE_OK) 35 fprintf(stderr, "curl_easy_perform() failed: %s\n", 36 curl_easy_strerror(res)); 37 curl_easy_cleanup(curl); 38 } 39 //cout << "buffer:" << result << endl; 40 curl_global_cleanup(); 41 return result; 42 }
注意到,我们将writer作为参数的时候做了一次强制类型转换。之前没有这个强制类型转换,程序会退出,并返回-1
时间: 2024-11-08 11:17:09