C++ 如何将PUT curl映射到CPP Curlpp?
我想将下面的curl(此curl在Linux终端中正常工作)映射/写入cpp代码:C++ 如何将PUT curl映射到CPP Curlpp?,c++,c,curl,curlpp,C++,C,Curl,Curlpp,我想将下面的curl(此curl在Linux终端中正常工作)映射/写入cpp代码: curl -X PUT -u "abc" \ "https://api123.pl" \ -d 'symbol=EB&side=ri&quantity=3' 下面是使用Curlpp库的CPP代码: #include <iostream> #include <sstream> #include <curlpp/cURLpp.hp
curl -X PUT -u "abc" \
"https://api123.pl" \
-d 'symbol=EB&side=ri&quantity=3'
下面是使用Curlpp库的CPP代码:
#include <iostream>
#include <sstream>
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
using namespace curlpp::options;
using namespace std;
/*
curl -X PUT -u "abc" \
"https://api123.pl" \
-d 'symbol=EB&side=ri&quantity=3'
g++ name1.cpp -lcurl -lcurlpp -o name1 && ./name1
*/
string test(const std::string &url) {
try {
curlpp::Cleanup cleanup;
curlpp::Easy request;
request.setOpt<curlpp::Options::Url>(url);
request.setOpt(new curlpp::options::UserPwd("abc"));
request.setOpt(new curlpp::options::CustomRequest{"PUT"});
// /*
//does not compile
std::list<std::string> postContent;
postContent.push_back("symbol:EB");
postContent.push_back("side:ri");
postContent.push_back("quantity:3");
request.setOpt(new curlpp::options::PostFields(postContent));
// */
std:stringstream content;
content << request;
return content.str().c_str();
}
catch (const curlpp::RuntimeError &e) {
std::cout << "CURLpp runtime error: " << e.what() << std::endl;
}
catch (const curlpp::LogicError &e) {
std::cout << "CURLpp logic error: " << e.what() << std::endl;
}
throw std::string("Error");
}
int main(int, char **) {
try {
cout << test("https://api123.pl");
}
catch(curlpp::RuntimeError & e) {
std::cout << e.what() << std::endl;
}
catch(curlpp::LogicError & e) {
std::cout << e.what() << std::endl;
}
return 0;
}
我不知道如何编写代码来使用curlpp将curl映射/写入cpp。谢谢您的帮助。PostFields
只是typedef
对于cURLpp::OptionTrait
,我正在简化下面的内容
如果您仔细阅读错误消息,它们会准确地告诉您出了什么问题:
错误:调用“curlpp::OptionTrait::OptionTrait(std::uu cxx11::list&)”时没有匹配的函数
这基本上是说,您不能将std::list
传递给PostFields
的构造函数。错误详细信息中报告了4个候选构造函数,其中没有一个将std::list
作为输入:
PostFields()
PostFields(const std::string&)
PostFields(常量PostFields&)
PostFields(PostFields&&)
实际上,如果您阅读了,就无法从std::list
创建PostFields
。这是有意义的,根据:
将char*作为参数传递,指向HTTP POST操作中要发送的完整数据。您必须确保数据的格式符合您希望服务器接收数据的方式。libcurl不会以任何方式为您转换或编码它。例如,web服务器可能假定此数据是url编码的
CURLOPT\u POSTFIELDS
需要一个char*
作为输入(cURLpp使用std::string
包装),因此您必须将PUT
数据作为一个url编码的字符串传递,就像您在命令行上所做的那样,例如:
request.setOpt(新的curlpp::Options::PostFields(“symbol=EB&side=ri&quantity=3”);
您是从哪里想到可以将std::list
与PostFields
一起使用的
顺便说一句,根据cURLpp文档,在向
cURLpp::Easy
对象添加选项时,实际上不需要使用new
:
curlpp::Easy request;
request.setOpt(curlpp::Options::Url(url));
request.setOpt(curlpp::Options::UserPwd("abc"));
request.setOpt(curlpp::Options::CustomRequest("PUT"));
request.setOpt(curlpp::Options::PostFields("symbol=EB&side=ri&quantity=3"));
无关:函数返回一个
字符串
,因此无需对content.str()
的结果调用c_str()
,该结果已经是字符串
,只需按原样返回它:return content.str()代码>好的,有道理,谢谢。谢谢你的帮助。我也在分析这一页:
std::list<std::string> postContent;
postContent.push_back("symbol:EB");
postContent.push_back("side:ri");
postContent.push_back("quantity:3");
request.setOpt(new curlpp::options::PostFields(postContent));
g++ name1.cpp -lcurl -lcurlpp -o name1 && ./name1
curlpp::Easy request;
request.setOpt(curlpp::Options::Url(url));
request.setOpt(curlpp::Options::UserPwd("abc"));
request.setOpt(curlpp::Options::CustomRequest("PUT"));
request.setOpt(curlpp::Options::PostFields("symbol=EB&side=ri&quantity=3"));