C++用libcurl实现http服务
在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