【发布时间】:2014-10-13 23:06:34
【问题描述】:
我想发出 HTTPS PUT 请求来放置一个 csv 文件。下面是用于将数据上传到 Xively 的代码。早些时候我收到了 411 length required 错误。我参考了此处可用的代码 (Send string in PUT request with libcurl) 来解决此问题,其中创建了 CURLOPT_CUSTOMREQUEST。现在我收到 HTTP 500 内部服务器错误。
void upload()
{
CURL *curl;
CURLcode res;
FILE * hd_src;
struct stat file_info;
struct curl_slist* header = NULL;
char * csvfile = "123.csv";
/* get the file size */
stat(csvfile, &file_info);
hd_src = fopen("123.csv","rb");
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl)
{
header = curl_slist_append(header,"X-ApiKey: 123123123"); /* API KEY HERE - sample only*/
header = curl_slist_append(header,"Accept: text/csv");
header = curl_slist_append(header, "Host: api.xively.com");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
/* Actual Xively feed is here. For demonstration purpose the feed is listed as 123 */
curl_easy_setopt(curl, CURLOPT_URL, "https://api.xively.com/v2/feeds/123.csv");
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT" );
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, hd_src);
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);
}
fclose(hd_src);
curl_slist_free_all(header);
curl_global_cleanup();
}
任何人都可以提出建议吗?如果我删除 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, hd_src),我会得到 411 length required 错误。我删除了这个并使用 file_info.st_size 将 Content-Length 添加到标题中。再次收到 411 length required 错误。使用 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, hd_src) 解决了 411 但 Xively 给出了 500 内部服务器错误。
提前致谢。
【问题讨论】: