繁体   English   中英

将自定义数据添加到 C++ 中的 cURL 请求

[英]Add custom data to cURL request in C++

我正在做一个需要许可系统的项目。 所以我决定使用我的销售平台 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 种不同的,我不知道哪一种是正确的。

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

很确定你忘记了easy.add<CURLOPT_POST>(1);

根据-d选项的curl 文档

-d,--数据

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

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

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

如果您以字母 @ 开头数据,则 rest 应该是从中读取数据的文件名,或者 - 如果您希望 curl 从标准输入读取数据。 因此,将使用 -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 @filename 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对,例如:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM