在C++程序中要和web服務器通信,可以使用libcurl實現httpf服務。libcurl是一個跨平台的網絡協議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協議。libcurl同樣支持HTTPS證書授權,HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認證。下載地址是:http://curl.haxx.se/download.html。
我是把這一系列的操作封裝在dll中的,供其他模塊使用。
strUrl為url地址
szPost為post參數。
extern "C" __declspec(dllexport) int __cdecl https_post(const char* strUrl,char *szPost) { CURL *curl; CURLcode res; res_buf = ""; curl = curl_easy_init(); //初始化 if(curl&&strUrl) { curl_easy_setopt(curl,CURLOPT_URL,strUrl); //設置url地址 if(szPost) { curl_easy_setopt(curl,CURLOPT_POSTFIELDS,szPost); //設置post參數 } curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_func); //設置回調函數
curl_easy_setopt(curl, CURLOPT_POST, 1); //設置為非0表示本次操作為POST curl_easy_setopt(curl,CURLOPT_WRITEDATA,&res_buf); //設置寫數據 res = curl_easy_perform(curl); //執行 if(res == CURLE_OK) {
//執行成功后的相關操作 curl_easy_cleanup(curl); return 1; } return -1; } return -1; }
static void write_func(char *ptr,size_t size,size_t nmemb,void *userdata) //回調函數
{
string& buffer = *(string*)userdata;
size_t len = size*nmemb;
for(size_t i = 0;i<len;++i)
{
buffer += *ptr;
++ptr;
}
}
常見的一些操作:
curl_easy_setopt(curl, CURLOPT_URL, POSTURL);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
CURLOPT_URL: URL地址
CURLOPT_POSTFIELDS: POST參數
CURLOPT_WRITEFUNCTION: 對返回的數據進行操作的函數地址
CURLOPT_WRITEDATA: 設置WRITEFUNCTION的第四個參數值
CURLOPT_POST: 設置為非0表示本次操作為POST
CURLOPT_VERBOSE: 設置為非0在執行時打印請求信息
CURLOPT_HEADER: 設置為非0將響應頭信息同響應體一起傳給WRITEFUNCTION
CURLOPT_FOLLOWLOCATION: 設置為非0,響應頭信息Location
