【问题标题】:Add custom data to cURL request in C++在 C++ 中将自定义数据添加到 cURL 请求
【发布时间】:2022-01-09 18:37:41
【问题描述】:

我正在开发一个需要许可系统的项目。所以我决定使用我的销售平台 Gumroad 的许可系统。

看起来很简单,唯一的问题是我似乎无法将自定义数据添加到 C++ 中的 cURL 请求中。

这是文档中发布的示例:

curl https://api.gumroad.com/v2/licenses/verify \
  -d "product_permalink=QMGY" \
  -d "license_key=YOUR_CUSTOMERS_LICENSE_KEY" \
  -X POST

这在 Ubuntu 终端上运行良好,但是当我尝试在 C++ 中实现它时,它不起作用。

这是 C++ 代码:

std::stringstream get_response()
{
   std::stringstream str;
   curl::curl_ios<std::stringstream> writer(str);

   curl::curl_easy easy(writer);

   easy.add<CURLOPT_URL>("https://api.gumroad.com/v2/licenses/verify");
   easy.add<CURLOPT_POSTFIELDS>("product_permalink=QMGY");
   easy.add<CURLOPT_POSTFIELDS>("license_key=YOUR_CUSTOMERS_LICENSE_KEY");

   try
   {
      easy.perform();
   }
   catch (curl::curl_easy_exception error)
   {
      auto errors = error.get_traceback();
      error.print_traceback();
   }

   return str;
}

它能够从服务器获得响应,但它无法识别许可证密钥。

我认为这是因为CURLOPT_POSTFIELDS 不是替换-d 的正确字段。

有谁知道使用正确的字段吗?

大约有 300 种不同的,我不知道哪一种是正确的。

有人可以指点我正确的方向吗?

【问题讨论】:

    标签: c++ curl libcurl


    【解决方案1】:

    根据curl documentation-d 选项:

    -d,--数据

    (HTTP MQTT) 将 POST 请求中的指定数据发送到 HTTP 服务器,就像浏览器在用户填写 HTML 表单并按下提交按钮时所做的一样。这将导致 curl 使用 content-type application/x-www-form-urlencoded 将数据传递给服务器。与 -F、--form 比较。

    --data-raw 几乎相同,但对@ 字符没有特殊解释。要发布纯二进制数据,您应该改用 --data-binary 选项。要对表单字段的值进行 URL 编码,您可以使用 --data-urlencode。

    如果在同一命令行上多次使用这些选项中的任何一个,则指定的数据片段将与分隔符 & 符号合并。因此,使用“-d name=daniel -d Skill=lousy”会生成一个看起来像“name=daniel&skill=lousy”的帖子块。

    如果您以字母 @ 开头数据,则其余部分应该是从中读取数据的文件名,或者 - 如果您希望 curl 从 stdin 读取数据。因此,将使用 -d, --data @foobar 从名为“foobar”的文件发布数据。当 -d, --data 被告知从这样的文件中读取时,将删除回车符和换行符。如果您不希望 @ 字符具有特殊解释,请改用 --data-raw。

    例子:

     curl -d "name=curl" https://example.com
    curl -d "name=curl" -d "tool=cmdline" https://example.com
    curl -d @文件名https://example.com

    另请参阅--data-binary、--data-urlencode 和--data-raw。此选项覆盖 -F、--form 和 -I、--head 和 -T、--upload-file。

    注意关于多次指定-d的部分。

    CURLOPT_POSTFIELDS 是要使用的正确字段。您只是以错误的方式使用它。您只需要设置一次CURLOPT_POSTFIELDS,以服务器期望的正确格式提供所有要发布的数据。由于您尝试发布application/x-www-form-urlencoded 格式,因此数据需要为name=value 对,以&amp; 分隔,例如:

    std::stringstream get_response()
    {
       std::stringstream str;
       curl::curl_ios<std::stringstream> writer(str);
    
       curl::curl_easy easy(writer);
    
       easy.add<CURLOPT_URL>("https://api.gumroad.com/v2/licenses/verify");
       easy.add<CURLOPT_POSTFIELDS>("product_permalink=QMGY&license_key=YOUR_CUSTOMERS_LICENSE_KEY");
    
       try
       {
          easy.perform();
       }
       catch (curl::curl_easy_exception error)
       {
          auto errors = error.get_traceback();
          error.print_traceback();
       }
    
       return str;
    }
    

    如果任何 namevalue 数据可能包含保留字符或非 ASCII 字符,则必须对该数据进行 url 编码,例如使用 curl_easy_escape()

    【讨论】:

    • 非常感谢雷米!!这是完美的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多