【问题标题】:Using CURL in C++/C to issue a GET HTTP Request with a data file在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求
【发布时间】:2020-05-25 23:13:04
【问题描述】:

在命令行中使用 CURL:

curl -d @%1 -X GET https://blah-blah

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

就我的一生而言,当我在语法上尝试 pro 时,我无法让它发挥作用。它必须是可能的,因为它可以在命令上完成。但是,当我设置

curl_easy_setopt(m_Curl, CURLOPT_HTTPGET, 1);

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

如果我使用:

curl_easy_setopt(m_Curl, CURLOPT_UPLOAD, 1L);

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

任何指导将不胜感激。

谢谢,

斯坦

【问题讨论】:

  • 您不能在 HTTP GET 请求中上传数据,只能在 PUTPOST 请求中上传。

标签: c++ curl get


【解决方案1】:

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

如果您确实需要使用 GET 发送包含正文的请求,您可以使用 CURLOPT_CUSTOMREQUEST 更改方法的值。这不会改变 curl 的行为。这个 sn-p 将使用 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);
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2015-12-05
    • 2017-03-11
    • 2023-04-02
    • 2018-08-10
    相关资源
    最近更新 更多