使用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 }

 

posted on 2017-02-24 17:54  一揽芳华  阅读(1384)  评论(0编辑  收藏  举报

导航