您的位置:首页 > 理论基础 > 计算机网络

C/C++中libcurl的使用-提交 Http Post请求

2018-01-28 11:08 260 查看
之前介绍了使用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;
}


在上述代码中,使用libcurl的POST选项将表单数据提交到相应的服务器,在正确响应结果后,将返回的json格式的数据写到本地的磁盘文件上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: