curl http之post与formpost
curl
curl是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。curl还支持SSL认证、HTTP POST、HTTP PUT、FTP上传, HTTP form based upload、proxies、HTTP/2、cookies、用户名+密码认证(Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)、file transfer resume、proxy tunneling。更具体的说明包括示例请移步社区链接。
社区链接
curl 官网:https://curl.haxx.se/
book:https://bookcurl.haxx.se
安装curl
个人电脑是ubuntu系统,命令安装即可,其他系统没试过。当然也可以下载安装包进行安装。
sudo apt-get install libcurl-openssl-dev
post示例
#include <curl/curl.h>
#include <string.h>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
struct MemoryStruct {
char *memory;
size_t size;
};
size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
userp = mem;
return realsize;
}
int add_image() {
CURL *curl;
cJSON *post_json = cJSON_CreateObject();
if (!post_json) {
return false;
}
cJSON_AddStringToObject(post_json, "img_id", "test");
std::string post_data = cJSON_PrintUnformatted(post_json);
cJSON_Delete(post_json);
printf("%s\n", post_data.c_str());
curl = curl_easy_init();
/* initialize custom header list (stating that Expect: 100-continue is not
wanted */
headerlist = curl_slist_append(headerlist, "Expect:");
if (curl) {
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.2:80/image");
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());
struct MemoryStruct chunk;
chunk.memory = (char *)malloc(1);
if (NULL == chunk.memory) {
curl_slist_free_all(headerlist);
curl_formfree(formpost);
curl_easy_cleanup(curl);
return false;
}
chunk.size = 0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
CURLcode res = curl_easy_perform(curl);
printf("--> res: %d\n", res);
printf("--> %s\n", chunk.memory);
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
curl_slist_free_all(headerlist);
free(chunk.memory);
}
return 0;
}
postform示例 - file
#include <curl/curl.h>
#include <string.h>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
struct MemoryStruct {
char *memory;
size_t size;
};
size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
userp = mem;
return realsize;
}
int add_image() {
CURL *curl;
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
struct curl_slist *headerlist = NULL;
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "img", CURLFORM_FILE,
"/home/ubuntu/Pictures/test.jpg", CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "img_id",
CURLFORM_COPYCONTENTS, "test", CURLFORM_END);
curl = curl_easy_init();
/* initialize custom header list (stating that Expect: 100-continue is not
wanted */
headerlist = curl_slist_append(headerlist, "Expect:");
if (curl) {
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.2:80/image");
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
struct MemoryStruct chunk;
chunk.memory = (char *)malloc(1);
if (NULL == chunk.memory) {
curl_slist_free_all(headerlist);
curl_formfree(formpost);
curl_easy_cleanup(curl);
return false;
}
chunk.size = 0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
CURLcode res = curl_easy_perform(curl);
printf("--> res: %d\n", res);
printf("--> %s\n", chunk.memory);
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
curl_slist_free_all(headerlist);
free(chunk.memory);
}
return 0;
}
postform示例 - buffer
#include <curl/curl.h>
#include <string.h>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
struct MemoryStruct {
char *memory;
size_t size;
};
size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
userp = mem;
return realsize;
}
int add_image() {
CURL *curl;
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
struct curl_slist *headerlist = NULL;
char *img_buf;
std::vector<unsigned char> buff;
cv::Mat img = cv::imread("/home/ubuntu/Pictures/test.jpg");
cv::imencode(".jpg", img, buff);
img_buf = (char *)malloc(buff.size());
memcpy(img_buf, &buff[0], buff.size());
for (int j = 0; j < buff.size(); j++) {
img_buf[j] = buff[j];
}
int len = buff.size();
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "img", CURLFORM_BUFFER,
"data", CURLFORM_BUFFERPTR, img_buf, CURLFORM_BUFFERLENGTH, len,
CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "img_id",
CURLFORM_COPYCONTENTS, "test1", CURLFORM_END);
curl = curl_easy_init();
/* initialize custom header list (stating that Expect: 100-continue is not
wanted */
headerlist = curl_slist_append(headerlist, "Expect:");
if (curl) {
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.2:80/image");
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
struct MemoryStruct chunk;
chunk.memory = (char *)malloc(1);
if (NULL == chunk.memory) {
curl_slist_free_all(headerlist);
curl_formfree(formpost);
curl_easy_cleanup(curl);
return false;
}
chunk.size = 0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
CURLcode res = curl_easy_perform(curl);
printf("--> res: %d\n", res);
printf("--> %s\n", chunk.memory);
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
curl_slist_free_all(headerlist);
free(chunk.memory);
}
return 0;
}
end
入门快速上手贴,有问题的地方请指正。更详细的操作请移步本文社区链接。