在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求

Using CURL in C++/C to issue a GET HTTP Request with a data file

本文关键字:数据 文件 请求 HTTP GET C++ CURL      更新时间:2023-10-16

在命令行中使用 CURL:

curl -d @%1 -X 获取 https://blah-blah

这是在Windows批处理文件中,我在命令行上传递文件的名称。使用它,我可以在包含大量输入参数的文件中发出服务调用,并收到大量输出。

对于我的生活,当我尝试pro\语法时,我无法让它工作。它必须是可能的,因为它可以在命令上完成。但是,当我设置

curl_easy_setopt(m_Curl, CURLOPT_HTTPGET, 1);

即使设置了回调,我也无法上传文件

如果我使用:

curl_easy_setopt(m_Curl, CURLOPT_UPLOAD, 1L);

调用变为"PUT",即使我尝试强制标头为 GET。我遵循文档,可以看到这是记录的行为。但是,避免这种违约的途径是什么?

任何指导将不胜感激。

谢谢

斯坦

AFAIK 这不是严格禁止的,但你不应该发送带有 GET 请求的正文。另一方面,服务器应该能够处理带有正文的GET请求,但响应不应依赖于正文的内容。

如果您确实需要使用 GET 发送包含正文的请求,您可以使用CURLOPT_CUSTOMREQUEST更改方法的值。这不会改变 curl 的行为。此代码段将使用 GET 上传数据:

CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_PORT, port);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
const auto* file = fopen(filename.c_str(), "r");
curl_easy_setopt(curl, CURLOPT_READDATA, file);
curl_easy_setopt(
curl, CURLOPT_INFILESIZE_LARGE, static_cast<curl_off_t>(filesize));
curl_easy_perform(curl);
}

您还可以使用 CURLOPT_POSTFIELDS 命令将正文粘贴为字符串。之后,您将请求更改为 GET,就像@Thomas Sablik 的答案一样。

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
// Set target URL
curl_easy_setopt(curl, CURLOPT_URL, requestURL.c_str());
// Set HTTP version
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long) CURL_HTTP_VERSION_3);
// Set POST fields
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBody.c_str());
// Set request to get
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
// Set response target
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
// Perform CURL request
CURLcode res = curl_easy_perform(curl);