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

入门快速上手贴,有问题的地方请指正。更详细的操作请移步本文社区链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值