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