记录一次curl的使用报错:使用PUT的设置错误

  • 错误打印
    发送put请求,返回超时
  • 具体代码体现
    同事设置发送PUT请求用的接口是
curl_easy_setopt(curl, CURLOPT_PUT, true);                                 //默认为0。设置为1表示发起一次post请求
curl_easy_setopt(curl, CURLOPT_PUT, 1L);                                   //设置为1表示发起一次post请求

但其实应该是

curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
  • 原因如下
    ①curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, “PUT”)设置libcurl库发送HTTP请求的自定义方法为PUT。
    ②而curl_easy_setopt(curl, CURLOPT_PUT, true)是错误的,因为CURLOPT_PUT选项不是用于设置HTTP请求方法的选项。
    ③实际上,CURLOPT_PUT选项是用于启用FTP上传的选项。因此,如果您要使用libcurl库发送PUT请求,请使用curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, “PUT”)。

  • 启用FTP上传的代码示例
    1)不用CURLOPT_PUT

#include <curl/curl.h>
#include <stdio.h>

int main(void)
{
  CURL *curl;
  FILE *file_pointer;
  const char *file_path = "/path/to/file.txt";
  const char *ftp_url = "ftp://example.com/upload/";
  const char *login = "username:password";
  struct stat file_info;
  double file_size;

  /* get the file size */
  if(stat(file_path, &file_info)) {
    printf("Could not get file size\n");
    return 1;
  }
  file_size = (double)file_info.st_size;

  /* open the file */
  file_pointer = fopen(file_path, "rb");
  if(!file_pointer) {
    printf("Could not open file\n");
    return 1;
  }

  /* initialize curl */
  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
  if(curl) {
    /* set FTP upload options */
    curl_easy_setopt(curl, CURLOPT_URL, ftp_url);
    curl_easy_setopt(curl, CURLOPT_USERPWD, login);
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
    curl_easy_setopt(curl, CURLOPT_READDATA, file_pointer);
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_size);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    /* perform the upload */
    curl_easy_perform(curl);

    /* cleanup */
    curl_easy_cleanup(curl);
  }
  curl_global_cleanup();
  fclose(file_pointer);
  return 0;
}

2)用CURLOPT_PUT

直接上传内存数据的例子

#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
 
#include "curl/curl.h"
 
typedef struct {
    char *data;
    char *pos;
    char *last;
} drp_upload_ctx;
 
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
    drp_upload_ctx *ctx = (drp_upload_ctx *) stream;
    size_t len = 0;
 
    if (ctx->pos >= ctx->last) {
        return 0;
    }
 
    if ((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
        return 0;
    }
 
    len = ctx->last - ctx->pos;
    if (len > size*nmemb) {
        len = size * nmemb;
    }
 
    memcpy(ptr, ctx->pos, len);
    ctx->pos += len;
 
    printf("send len=%zu\n", len);
 
    return len;
}
 
int main(int argc, char **argv)
{
  CURL *curl;
  CURLcode res;
  struct curl_slist   *header = NULL;
 
  char *url = argv[1];
  char data[16]="abcdefghijklmnop";
 
  drp_upload_ctx *upload_ctx = (drp_upload_ctx *) malloc(sizeof(drp_upload_ctx));
  if (upload_ctx == NULL) {
    return 1;
  }
 
  upload_ctx->data = data;
  upload_ctx->pos = data;
  upload_ctx->last = upload_ctx->pos + 16;
 
  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
 
  if (curl) {
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
    curl_easy_setopt(curl, CURLOPT_PUT, 1L);
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_READDATA, upload_ctx);
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
                     (curl_off_t)(upload_ctx->last - upload_ctx->pos));
 
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
 
    //header = curl_slist_append(header, "Expect:");
    //curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
 
    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_global_cleanup();
  //curl_slist_free_all(header);
  free(upload_ctx);
 
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值