使用Curl做Post请求
1.新建项目,名为 CurlTest,设定为 win32控制台项目
2.项目->属性->C/C++->常规->附加包含目录 D:\Codes\Visual Studio Projects\CurlTest\Include
3.项目->属性->C/C++->代码生成->运行时库 在Debug时,选择MTd,Release时选择MT
4.项目->属性->链接器->常规->附加库目录 D:\Codes\Visual Studio Projects\CurlTest\Lib
5.项目->属性->链接器->输入->附加依赖项 libcurl.lib
6.文件及目录结构
CurlTest |-Include | |-curl | |-curl.h | |-curlver.h | |-easy.h | |-mprintf.h | |-multi.h | |-stdcheaders.h | |-types.h |-Lib | |-libcurl.dll | |-libcurl.lib |-CurlTest.cpp |-CurlTest.ncb |-CurlTest.sln |-CurlTest.vcproj |-stdafx.cpp |-stdafx.h
CurlTest.cpp 源码
1 #include "stdafx.h" 2 #include "curl/curl.h" 3 #include "assert.h" 4 //不带SSL 5 #pragma comment(lib, "libcurl.lib") 6 7 /* 8 ptr是指向存储数据的指针, 9 size是每个块的大小, 10 nmemb是指块的数目, 11 stream是用户参数。 12 所以根据以上这些参数的信息可以知道,ptr中的数据的总长度是size*nmemb 13 */ 14 size_t call_wirte_func(const char *ptr, size_t size, size_t nmemb, std::string *stream) 15 { 16 assert(stream != NULL); 17 size_t len = size * nmemb; 18 stream->append(ptr, len); 19 return len; 20 } 21 // 返回http header回调函数 22 size_t header_callback(const char *ptr, size_t size, size_t nmemb, std::string *stream) 23 { 24 assert(stream != NULL); 25 size_t len = size * nmemb; 26 stream->append(ptr, len); 27 return len; 28 } 29 30 31 int _tmain(int argc, _TCHAR* argv[]) 32 { 33 CURL *curl; 34 CURLcode code; 35 std::string szbuffer; 36 std::string szheader_buffer; 37 char errorBuffer[CURL_ERROR_SIZE]; 38 std::string url = "http://api.***.com/CheckUsrBalance"; 39 /* 40 CURL_GLOBAL_ALL //初始化所有的可能的调用。 41 CURL_GLOBAL_SSL //初始化支持 安全套接字层。 42 CURL_GLOBAL_WIN32 //初始化win32套接字库。 43 CURL_GLOBAL_NOTHING //没有额外的初始化。 44 */ 45 curl_global_init(CURL_GLOBAL_ALL); 46 curl = curl_easy_init(); 47 if (curl) { 48 // 远程URL,支持 http, https, ftp 49 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 50 // 官方下载的DLL并不支持GZIP,Accept-Encoding:deflate, gzip 51 curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip, deflate"); 52 //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);//调试信息打开 53 54 /* POST 数据 */ 55 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=yehua&key=d8kredfsca1f99b8322b3ef326cc9ce261701c4c8hd9esj"); 56 //设置重定向的最大次数 57 curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5); 58 //设置301、302跳转跟随location 59 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); 60 //抓取内容后,回调函数 61 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, call_wirte_func); 62 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &szbuffer); 63 //抓取头信息,回调函数 64 curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); 65 curl_easy_setopt(curl, CURLOPT_HEADERDATA, &szheader_buffer); 66 67 /* 68 CURLE_OK 任务完成一切都好 69 CURLE_UNSUPPORTED_PROTOCOL 不支持的协议,由URL的头部指定 70 CURLE_COULDNT_CONNECT 不能连接到remote 主机或者代理 71 CURLE_REMOTE_ACCESS_DENIED 访问被拒绝 72 CURLE_HTTP_RETURNED_ERROR Http返回错误 73 CURLE_READ_ERROR 读本地文件错误 74 CURLE_SSL_CACERT 访问HTTPS时需要CA证书路径 75 */ 76 code = curl_easy_perform(curl); 77 if (CURLE_OK == code) { 78 double val; 79 80 /* check for bytes downloaded */ 81 code = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &val); 82 if ((CURLE_OK == code) && (val>0)) 83 printf("Data downloaded: %0.0f bytes.\n", val); 84 85 /* check for total download time */ 86 code = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &val); 87 if ((CURLE_OK == code) && (val>0)) 88 printf("Total download time: %0.3f sec.\n", val); 89 90 /* check for average download speed */ 91 code = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &val); 92 if ((CURLE_OK == code) && (val>0)) 93 printf("Average download speed: %0.3f kbyte/sec.\n", val / 1024); 94 95 printf("%s\n", szbuffer.c_str()); 96 } 97 else { 98 fprintf(stderr, "Failed to get '%s' [%s]\n", url, errorBuffer); 99 // exit(EXIT_FAILURE); 100 } 101 102 /* 释放内存 */ 103 curl_easy_cleanup(curl); 104 } 105 curl_global_cleanup(); 106 107 getchar(); 108 return 0; 109 }