curl http之post与formpost
curl http之post与formpost
- curl
- 安装curl
- post示例
- postform示例 - file
- postform示例 - buffer
- end
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 notwanted */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 notwanted */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 notwanted */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
入门快速上手贴,有问题的地方请指正。更详细的操作请移步本文社区链接。
curl http之post与formpost相关推荐
- curl http或https上传下载
curl的使用 注意如果是https请求需要带上ssl的库和curl库如下图 上传文件 回调函数 static size_t http_data_writer(void* data, size_t s ...
- 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)
最近在写一个应用程序, 需要与HTTP服务器进行数据交互, 于是乎自己写了一个类似wget的功能的客户端, 实现很简单, 但是功能不给力, 只可基本功能. 于是又在网上找了找, 发现使用libcurl ...
- C++用libcurl通过HTTP以表单的方式Post数据到服务器
POST字符串 #include <stdio.h> #include <curl/curl.h>int main(void) {CURL* curl = NULL;CURLc ...
- HTTP上传文件的总结
因为工作中做个客户端,需要和web后端打交道,用的都是http的接口.对http接口也不是很熟,就自己搭个环境测试了解这个过程. 后端就随便选用一个可以用的框架就好了.框架反正都是调用api基本都是一 ...
- Libcurl的编译_HTTP/HTTPS客户端源码示例
HTTP/HTTPS客户端源码示例 环境: zlib-1.2.8 openssl-1.0.1g curl-7.36 Author: Kagula LastUpdateDate: 2016-05 ...
- C++ vs2017 - libcurl - http请求 代码大全(请求数据,上传下载文件,多线程上传下载文件)
在网上搜寻各种libcurl的用法,将代码集合于此! 目录 一.配置curl项目 二.Curl 请求参数 1. CURLOPT_POST 2. CURLOPT_URL 3. CURLOPT_HTTPH ...
- libcurl API 常用函数
libcurl 详参libcurl 1 curl_easy_getinfo CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); 使 ...
- C++下使用libcurl实现微信公众号推送消息到粉丝账号
最近,需要将公司的产品报警信息推送到用户的微信上,之前有过FaceBook和Twitter API使用经验,但真正应用到产品还没有过,今天跑通了原理,记录一下: 入门原理:http://www.360 ...
- php 使用 curl 报错,PHP CURL post数据报错 failed creating formpost data
在做微信卡券使用curl上传logo图片时,发现一个报错: failed creating formpost data 代码中数组如下: 结合微信给的文档,检查语法,貌似并没有发现什么错误... 经过 ...
最新文章
- HTML5:理解head
- android自定义尺子收集demo
- 《Head First 设计模式》ch.3 装饰(Decorator)模式
- 用了 HTTPS,没想到还是被监控了!
- 图论算法(五)--求解割点、割边(JAVA)
- 开源通用爬虫框架YayCrawler-页面的抽取规则定义
- 如何通过字典表来获取下拉数据的实现
- [14-01] 闭包
- java调用数据库存储过程_Java调用SQL Server的存储过程详解
- ASP.NET状态管理之五(Cookie)
- 漏洞复现|CVE-2021-40444(Microsoft MSHTML 远程代码执行漏洞)
- 【免费】搜狗站长URL自动推送工具1.4.1
- linux音频设备id,ubuntu下提取DSDT SSDT和声卡ID _ 黑苹果乐园
- Spring 源码解析 七(aop )
- Java|IO流之字符流
- ACL(访问控制列表)
- 七:对微服务配置中心的理解
- mysql判断产品是否过期_7个方法教你判断打开的产品是否已过期
- 计算机网络基础——网络的性能
- XP下解决暗黑2全屏模式花屏问题