C++ 如何将PUT curl映射到CPP Curlpp?

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(此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.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"));