c++ - 如何将 PUT curl 映射到 CPP 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.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;
    }

编译时出现错误:

1.2putStackoverflow.cpp: In function ‘std::string getJSONAPIResultFromURL(const string&)’:
1.2putStackoverflow.cpp:31:67: error: no matching function for call to ‘curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>::OptionTrait(std::__cxx11::list<std::__cxx11::basic_string<char> >&)’
   31 |         request.setOpt(new curlpp::options::PostFields(postContent));
      |                                                                   ^
In file included from /usr/include/curlpp/Option.hpp:251,
                 from /usr/include/curlpp/Easy.hpp:31,
                 from 1.2putStackoverflow.cpp:4:
/usr/include/curlpp/Option.inl:129:1: note: candidate: ‘curlpp::OptionTrait<OptionType, opt>::OptionTrait() [with OptionType = std::__cxx11::basic_string<char>; CURLoption opt = CURLOPT_POSTFIELDS]’
  129 | OptionTrait<OptionType, option>::OptionTrait()
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/curlpp/Option.inl:129:1: note:   candidate expects 0 arguments, 1 provided
/usr/include/curlpp/Option.inl:123:1: note: candidate: ‘curlpp::OptionTrait<OptionType, opt>::OptionTrait(typename curlpp::Option<OptionType>::ParamType) [with OptionType = std::__cxx11::basic_string<char>; CURLoption opt = CURLOPT_POSTFIELDS; typename curlpp::Option<OptionType>::ParamType = const std::__cxx11::basic_string<char>&]’
  123 | OptionTrait<OptionType, option>::OptionTrait(typename Option<OptionType>::ParamType value)
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/curlpp/Option.inl:123:85: note:   no known conversion for argument 1 from ‘std::__cxx11::list<std::__cxx11::basic_string<char> >’ to ‘curlpp::Option<std::__cxx11::basic_string<char> >::ParamType’ {aka ‘const std::__cxx11::basic_string<char>&’}
  123 | OptionTrait<OptionType, option>::OptionTrait(typename Option<OptionType>::ParamType value)
      |                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
In file included from /usr/include/curlpp/Easy.hpp:31,
                 from 1.2putStackoverflow.cpp:4:
/usr/include/curlpp/Option.hpp:145:8: note: candidate: ‘curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>::OptionTrait(const curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>&)’
  145 |  class OptionTrait : public Option<OptionType>
      |        ^~~~~~~~~~~
/usr/include/curlpp/Option.hpp:145:8: note:   no known conversion for argument 1 from ‘std::__cxx11::list<std::__cxx11::basic_string<char> >’ to ‘const curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>&’
/usr/include/curlpp/Option.hpp:145:8: note: candidate: ‘curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>::OptionTrait(curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>&&)’
/usr/include/curlpp/Option.hpp:145:8: note:   no known conversion for argument 1 from ‘std::__cxx11::list<std::__cxx11::basic_string<char> >’ to ‘curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>&&’

问题在于:

        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 将 curl 映射/写入 cpp。感谢您的帮助。

最佳答案

PostFields只是一个typedef对于 cURLpp::OptionTrait<std::string, cURL::CURLOPT_POSTFIELDS> ,我正在简化下面的事情。

如果您仔细阅读错误消息,它们会准确地告诉您哪里出了问题:

error: no matching function for call to 'curlpp::OptionTrait<std::__cxx11::basic_string<char>, CURLOPT_POSTFIELDS>::OptionTrait(std::__cxx11::list<std::__cxx11::basic_string<char> >&)'

这基本上是说你不能传递 std::list<std::string>PostFields 的构造函数.错误详细信息中报告了 4 个候选构造函数,其中没有一个采用 std::list。作为输入:

PostFields()
PostFields(const std::string&)
PostFields(const PostFields&)
PostFields(PostFields&&)

确实,如果您阅读 cURLpp documentation , 你不能创建 PostFields来自std::list .这是有道理的,根据 cURL documentation对于 CURLOPT_POSTFIELDS :

Pass a char * as parameter, pointing to the full data to send in an HTTP POST operation. You must make sure that the data is formatted the way you want the server to receive it. libcurl will not convert or encode it for you in any way. For example, the web server may assume that this data is url-encoded.

CURLOPT_POSTFIELDS期望单个 char*作为输入(cURLpp 使用 std::string 包装),所以你必须传递你的 PUT数据作为单个 url 编码的字符串,就像您在命令行上所做的那样,例如:

request.setOpt(new curlpp::Options::PostFields("symbol=EB&side=ri&quantity=3"));

您是从哪里想到可以使用 std::list 的?与 PostFields


顺便说一句,根据 cURLpp 文档,您实际上不需要使用 newcurlpp::Easy 添加选项时对象:

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"));

关于c++ - 如何将 PUT curl 映射到 CPP Curlpp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58342524/

相关文章:

c - 查找 C 中的段错误

php - Paypal IPN 系统无法正常工作?

c++ - 编码器的 PDF 规范 : Adobe or ISO?

c - 格式 '%s' 需要类型为 '*char' 的参数,但参数 2 的类型为 'int'

c++ - 声明不兼容,初学者 c++

c - 如何一次性读取所有CPU核心的频率?

重定向后的 PHP Curl

php - magento 下的 sslv3 警报握手失败

c++ - 使用友元函数重载算术运算符

c++ - 将字符串转换为自定义类