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相关推荐

  1. curl http或https上传下载

    curl的使用 注意如果是https请求需要带上ssl的库和curl库如下图 上传文件 回调函数 static size_t http_data_writer(void* data, size_t s ...

  2. 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)

    最近在写一个应用程序, 需要与HTTP服务器进行数据交互, 于是乎自己写了一个类似wget的功能的客户端, 实现很简单, 但是功能不给力, 只可基本功能. 于是又在网上找了找, 发现使用libcurl ...

  3. C++用libcurl通过HTTP以表单的方式Post数据到服务器

    POST字符串 #include <stdio.h> #include <curl/curl.h>int main(void) {CURL* curl = NULL;CURLc ...

  4. HTTP上传文件的总结

    因为工作中做个客户端,需要和web后端打交道,用的都是http的接口.对http接口也不是很熟,就自己搭个环境测试了解这个过程. 后端就随便选用一个可以用的框架就好了.框架反正都是调用api基本都是一 ...

  5. Libcurl的编译_HTTP/HTTPS客户端源码示例

    HTTP/HTTPS客户端源码示例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2016-05 ...

  6. C++ vs2017 - libcurl - http请求 代码大全(请求数据,上传下载文件,多线程上传下载文件)

    在网上搜寻各种libcurl的用法,将代码集合于此! 目录 一.配置curl项目 二.Curl 请求参数 1. CURLOPT_POST 2. CURLOPT_URL 3. CURLOPT_HTTPH ...

  7. libcurl API 常用函数

    libcurl 详参libcurl 1 curl_easy_getinfo CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); 使 ...

  8. C++下使用libcurl实现微信公众号推送消息到粉丝账号

    最近,需要将公司的产品报警信息推送到用户的微信上,之前有过FaceBook和Twitter API使用经验,但真正应用到产品还没有过,今天跑通了原理,记录一下: 入门原理:http://www.360 ...

  9. php 使用 curl 报错,PHP CURL post数据报错 failed creating formpost data

    在做微信卡券使用curl上传logo图片时,发现一个报错: failed creating formpost data 代码中数组如下: 结合微信给的文档,检查语法,貌似并没有发现什么错误... 经过 ...

最新文章

  1. HTML5:理解head
  2. android自定义尺子收集demo
  3. 《Head First 设计模式》ch.3 装饰(Decorator)模式
  4. 用了 HTTPS,没想到还是被监控了!
  5. 图论算法(五)--求解割点、割边(JAVA)
  6. 开源通用爬虫框架YayCrawler-页面的抽取规则定义
  7. 如何通过字典表来获取下拉数据的实现
  8. [14-01] 闭包
  9. java调用数据库存储过程_Java调用SQL Server的存储过程详解
  10. ASP.NET状态管理之五(Cookie)
  11. 漏洞复现|CVE-2021-40444(Microsoft MSHTML 远程代码执行漏洞)
  12. 【免费】搜狗站长URL自动推送工具1.4.1
  13. linux音频设备id,ubuntu下提取DSDT SSDT和声卡ID _ 黑苹果乐园
  14. Spring 源码解析 七(aop )
  15. Java|IO流之字符流
  16. ACL(访问控制列表)
  17. 七:对微服务配置中心的理解
  18. mysql判断产品是否过期_7个方法教你判断打开的产品是否已过期
  19. 计算机网络基础——网络的性能
  20. XP下解决暗黑2全屏模式花屏问题

热门文章

  1. html文本框禁止汉字,html 文本框屏蔽非法字符
  2. 巨蟒python全栈开发flask10 项目开始2
  3. 进程,时间片,并发与并行
  4. 如何提升用户复购?这7个「不容错过」的营销策略请收好
  5. 你知道智能机柜与普通机柜有哪些区别吗
  6. 集简云 x 度量科技丨打通企业微信OA审批与招银云直联,实现支付信息自动同步网银系统
  7. 【极客时间】极客时间-小马哥Spring笔记
  8. ubuntu flash插件安装
  9. 【elasticsearch】 es状态查看节点分片信息:/_cat/shards
  10. JS Websocket 常用代码