[英]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;
}
如果任何name
或value
数据可能包含保留字符或非 ASCII 字符,则必须对该数据进行 url 编码,例如使用curl_easy_escape()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.