利用libcurl使用的curl_mime实现HTTP接口的form-data(表单)数据的上传(POST)
libcurl已经抛弃了curl_formadd的相关函数调用,不建议使用curl_formadd方式提交表单,需要使用curl_mime相关的api来实现。
https://curl.se/libcurl/c/curl_formadd.html
网上的例子比较少,我根据实践整理了一个C语言的例子:
int mime_post_form_data (int argc, char *argv[])
{
CURL *curl;
CURLcode res;
curl_mime *form = NULL;
curl_mimepart *file_field = NULL;
curl_mimepart *file_data = NULL;
curl_mimepart *tid_field = NULL;
struct curl_slist *list = NULL;
struct curl_slist *slist = NULL;
struct curl_slist *f_list = NULL;
char r_buf[2048];
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://xxx.yyyy.xxx"); //设置http接口地址
memset(r_buf,0x00,sizeof(r_buf));
//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //https方式需要加上ssl认证设置
//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);//https方式需要加上ssl认证设置
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply); //设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&r_buf); //设置返回数据的接受缓冲区
curl_easy_setopt(curl, CURLOPT_HEADER, 1);//取返回报文数据时和报文头一起取回。
//设置headers-------
list = curl_slist_append(list,"xxx:aaa"); //自定义的header值
list = curl_slist_append(list,"yyy:bbb"); //自定义的header值
list = curl_slist_append(list,"Connection: Keep-Alive");
list = curl_slist_append(list,"Content-Type:multipart/form-data");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
/* 创建表单/
form = curl_mime_init(curl);
/* 添加第一条表单数据/
tid_field = curl_mime_addpart(form);
curl_mime_name(tid_field,"tid");
curl_mime_type(tid_field,"text/plain");
curl_mime_data(tid_field,"添加的文本类型的表单数据,文件上传",CURL_ZERO_TERMINATED);
/* 添加第二条表单数据,上传文件/
file_field = curl_mime_addpart(form);
f_list = curl_slist_append(f_list, "Content-Transfer-Encoding: 8bit");
f_list = curl_slist_append(f_list, "Content-Range: 0-9962/9963");
f_list = curl_slist_append(f_list, "Content-Length: 9963");
curl_mime_headers(file_field, f_list, 1); //设置表单数据的头域
curl_mime_name(file_field,"File");
curl_mime_filedata(file_field, "./logo.png");
curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
/*执行POST发送请求*/
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
curl_mime_free(form);
printf("收到的buf=\n%s\n",r_buf);
/* free slist */
curl_slist_free_all(list);
}
return 0;
}