随笔 - 128  文章 - 1  trackbacks - 0
<2020年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿

随笔分类

随笔档案

收藏夹

调试技巧

搜索

  •  

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

之前介绍了使用libcurl的HTTP GET将url地址中内容下载到本地 C/C++中libcurl的使用-Http GET方法使用详解,在更早的文章Linux下使用CURL模拟用户提交post表单中也介绍过在Linux环境使用curl命令提交POST表单。本文介绍使用libcurl的HTTP POST实现表单的提交,并获取表单的结果。

libcurl的相关接口已经在上一篇文章中介绍,本文只介绍新增的相关接口和参数选项。

CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,const char *); //向curl_slist链表中追加参数,这些参数用于设置一个标准浏览器请求的相关参数。例如实际使用Chrome提交的请求参数如下:
  • 1
  • 2

这里写图片描述

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post); //CURLOPT_POST:参数post置为1表示libcurl将执行普通的HTTP POST操作,同时也意味着应该使用"Content-Type: application/x-www-form-urlencoded"作为请求的头部。
  • 1
  • 2
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata);  //CURLOPT_POSTFIELDS:指针postdata指向的是POST操作所提供的所有参数,postdata的数据格式应该和server端想要接收数据的格式相同,如JSON格式或者使用相关连词符组成的。
  • 1
  • 2
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size); //CURLOPT_POSTFIELDSIZE:设置提交参数的大小,而不是依赖于libcurl默认使用strlen来衡量该大小。没有此项配置或者size被置为-1,都意味着由libcurl使用strlen来计算长度。如果提交的内容大小超过2GB,应该使用CURLOPT_POSTFIELDSIZE_LARGE参数替代CURLOPT_POSTFIELDSIZE。
  • 1
  • 2
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename); //如果提交POST请求要读取cookie信息,可以使用如下的参数将cookie所在的地址传递进来,cookie数据的格式可以是旧版本的"Netscape / Mozilla"cookie格式,也可以是普通的HTTP header的dump文件。
  • 1
  • 2

示例代码:

#include <iostream> #include <string>  #include <curl/curl.h> #include <curl/types.h> #include <curl/easy.h>  #include <stdlib.h> #include <string.h> using namespace std;  struct MemoryStruct  {     char *memory;     size_t size;     MemoryStruct()     {         memory = (char *)malloc(1);           size = 0;     }     ~MemoryStruct()     {         free(memory);         memory = NULL;         size = 0;     } };  size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) {     size_t realsize = size * nmemb;     struct MemoryStruct *mem = (struct MemoryStruct *)data;      mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);     if (mem->memory)      {         memcpy(&(mem->memory[mem->size]), ptr, realsize);         mem->size += realsize;         mem->memory[mem->size] = 0;     }     return realsize; }  int main() {     CURLcode res = curl_global_init(CURL_GLOBAL_ALL);     if(CURLE_OK != res)     {         cout<<"curl init failed"<<endl;         return 1;     }      CURL *pCurl ;     pCurl = curl_easy_init();      if( NULL == pCurl)     {         cout<<"Init CURL failed..."<<endl;         return -1;     }      string url = "http://{IP}:{PORT}/search";     string filename = "result.json";      curl_slist *pList = NULL;     pList = curl_slist_append(pList,"Content-Type:application/x-www-form-urlencoded; charset=UTF-8");      pList = curl_slist_append(pList,"Accept:application/json, text/javascript, */*; q=0.01");      pList = curl_slist_append(pList,"Accept-Language:zh-CN,zh;q=0.8");      curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pList);       curl_easy_setopt(pCurl, CURLOPT_URL, url.c_str() ); //提交表单的URL地址      curl_easy_setopt(pCurl, CURLOPT_HEADER, 0L);  //启用时会将头文件的信息作为数据流输     curl_easy_setopt(pCurl, CURLOPT_FOLLOWLOCATION, 1L);//允许重定向     curl_easy_setopt(pCurl, CURLOPT_NOSIGNAL, 1L);      //将返回结果通过回调函数写到自定义的对象中     MemoryStruct oDataChunk;     curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &oDataChunk);     curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);       curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L); //启用时会汇报所有的信息     //post表单参数     string strJsonData;     strJsonData = "queryWord=CONTENT:码农&";     strJsonData += "startTime=1507605327&" ;     strJsonData += "endTime=1508210127&" ;     strJsonData += "maxCount=500&" ;     strJsonData += "contextLength=200" ;     //libcur的相关POST配置项     curl_easy_setopt(pCurl, CURLOPT_POST, 1L);     curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, strJsonData.c_str());       curl_easy_setopt(pCurl, CURLOPT_POSTFIELDSIZE, strJsonData.size());       res = curl_easy_perform(pCurl);      long res_code=0;     res=curl_easy_getinfo(pCurl, CURLINFO_RESPONSE_CODE, &res_code);      if(( res == CURLE_OK ) && (res_code == 200 || res_code == 201))     {         FILE* fTmpMem = (FILE*)oDataChunk.memory;         if (!fTmpMem) {          }         FILE *fp=fopen(filename.c_str(),"wb");         if(!fp)         {                cout<<"open file failed";             return -1;         }             fwrite(fTmpMem, 1, oDataChunk.size, fp);         fclose(fp);         return true;     }      curl_slist_free_all(pList);      curl_easy_cleanup(pCurl);     curl_global_cleanup();      return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124

在上述代码中,使用libcurl的POST选项将表单数据提交到相应的服务器,在正确响应结果后,将返回的json格式的数据写到本地的磁盘文件上。

posted on 2020-09-08 19:41 长戟十三千 阅读(37) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理