在C++中向cURL请求添加自定义数据



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

有人能给我指正确的方向吗?

根据-d选项的卷曲文档:

-d,--数据

(HTTPMQTT(将POST请求中的指定数据发送到HTTP服务器,方法与用户填写HTML表单并按下提交按钮时浏览器所做的相同。这将导致curl使用内容类型application/x-www-form-urlencoded将数据传递给服务器。与-F,--形式相比。

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

如果在同一命令行上多次使用这些选项中的任何一个,则指定的数据段将与分隔符&amp-象征因此,使用"-d name=daniel-d skill=dish"将生成一个类似于"name=daniel&技能=糟糕

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

示例:

卷曲-d";name=curl";https://example.com
卷曲-d";name=curl"-d";tool=cmdline";https://example.com
curl-d@filenamehttps://example.com

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

请注意关于多次指定-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()

最新更新