標籤:沒有 erro printf glob 處理 ace 發送 轉換 lob
想用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
c++將lambda作為callback函數