- 错误打印
发送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;
}