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

j9per5c4  于 2023-02-23  发布在  其他
关注(0)|答案(2)|浏览(302)

在命令行中使用CURL:
curl-d@%1-X获取https://blah-blah
这是一个Windows批处理文件,我在命令行中传递文件名。使用这个,我可以发出一个服务调用,在一个文件中发送大量的输入参数,我收到了大量的输出。
对于我的生活,当我尝试编程,我不能使它工作。这一定是可能的,因为它可以在命令上完成。然而,当我设置

curl_easy_setopt(m_Curl, CURLOPT_HTTPGET, 1);

我无法上载文件,即使我设置了回调
如果我使用:

curl_easy_setopt(m_Curl, CURLOPT_UPLOAD, 1L);

调用变成了'PUT',即使我试图强制头文件成为GET。我按照文档,可以看到这是记录的行为。但是,什么是避免这种默认的途径?
如有任何指导,我们将不胜感激。
谢谢你,
斯坦

41zrol4v

41zrol4v1#

AFAIK这并不是严格禁止的,但是你不应该发送一个带有主体的GET请求,另一方面,服务器应该能够处理一个带有主体的GET请求,但是响应不应该依赖于主体的内容。
如果你真的需要用GET发送一个包含请求体的请求,你可以用CURLOPT_CUSTOMREQUEST改变方法的值,这不会改变curl的行为。

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);
  }
jjjwad0x

jjjwad0x2#

您也可以使用CURLOPT_POSTFIELDS命令将主体粘贴为字符串,然后将请求更改为GET,就像@托马斯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);

相关问题