当使用C++做HTTP客户端时,目前通用的做法就是使用libcurl。其官方网站的地址是http://curl.haxx.se/,该网站主要提供了Curl和libcurl。Curl是命令行工具,用于完成FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP的命令的请求及接收回馈。libcurl提供给开发者,用于使用C++跨平台的开发各种网络协议的请求及响应。里面的文档非常齐全,不过都是英文的。
下载libcurl包,如果使用Linux平台,建议下载源文件编译;如果使用Windows平台,建议下载Win32 - MSVC,下载地址是:http://curl.haxx.se/download.html
使用前请先行配置。
#include
这里是要在一个MFC工程中调用libcurl库,为此新开辟了一个线程来进行处理。
AfxBeginThread(trans, pParam, 0, 0, NULL);
UINT CMFCApplication1Dlg::trans(LPVOID pParam)
{
CURL *curl = 0;
CURLcode res;
curl = curl_easy_init();//初始化 得到curl的指针
curl_global_init(CURL_GLOBAL_ALL);//全局初始化
struct curl_slist *headers = NULL;
char s[1024];
memset(s, 0, sizeof(s));
if (curl != 0) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1);
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type:application/json");
headers = curl_slist_append(headers, "charsets: utf-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POST, 1); // POST
//if(pParam!=NULL)
string a = CT2A((*(CString*)pParam).GetBuffer(0));
strcpy_s(s, a.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,s);
res = curl_easy_perform(curl);//执行http请求 函数完成传输任务
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);//回收curl指针
curl_global_cleanup();
}
//std::cin.get();
return 0;
}
代码是根据命令行转化过来的,命令行大致如下:
curl -v -x POST -d{} --header "Content-Type:application/json"
遇到的问题主要是:
数据包的格式:
注意双引号
CString number = CString("\"number\":");
自己搭建的json的数据包总是无法上传,后来查找blog改变了传进来的数据的格式。
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,s);