微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将boost beast http请求转换为字符串并写入ostringstream

如何解决将boost beast http请求转换为字符串并写入ostringstream

我正在尝试使用boost beast进行http调用,并希望在写入套接字之前将其写入;我试图使用ostringstream来获取请求的值以在打印的日志中获取它,并得到以下错误消息:

string verb = "POST";
using http::field;
http::request<http::string_body> request;
request.method_string(verb);
request.target(server_endpoint);
request.version(11);
request.set(field::host,hostname);
request.set(field::accept,"*/*");
request.set(field::authorization,authorization_token);
request.set(field::user_agent,client_name);
request.set(field::content_length,req_str.length());
request.set(field::content_type,"application/x-www-form-urlencoded");
request.set(field::connection,field::close);
request.body() = req_str;
request.prepare_payload();
fast_ostringstream oss;
oss <<"Request message" << request;
PBLOG_INFO(oss.str());
oss.clear();



HttpTracRequestHandler.cpp:78:26: error: invalid operands to binary expression ('framework::string_::fast_ostringstream' and
      'http::request<http::string_body>' (aka 'boost::beast::http::message<true,boost::beast::http::basic_string_body<char,std::char_traits<char>,std::allocator<char> >,boost::beast::http::basic_fields<std::allocator<char> > >'))
        oss <<"Request message" << request;
        ~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~
/BARXPBViewstore/GIT_Workspace/barx_rel/mq8_barx/barx-server/appl/include/FoxException/GenericException.h:133:19: note: candidate function
      [with TData = boost::beast::http::message<true,boost::beast::http::basic_fields<std::allocator<char> > >] not viable: no kNown conversion from
      'framework::string_::fast_ostringstream' to 'GenericException &' for 1st argument
GenericException& operator<<(GenericException &e,const TData& data)
                  ^
/BARXPBViewstore/GIT_Workspace/boost/boost_1_70_0/boost/beast/http/impl/write.hpp:921:1: note: candidate function [with isRequest = true,Body = boost::beast::http::basic_string_body<char,Fields =
      boost::beast::http::basic_fields<std::allocator<char> >] not viable: no kNown conversion from 'framework::string_::fast_ostringstream'
      to 'std::ostream &' (aka 'basic_ostream<char> &') for 1st argument
operator<<(std::ostream& os,^
/BARXPBViewstore/GIT_Workspace/boost/boost_1_70_0/boost/beast/http/write.hpp:721:1: note: candidate function [with isRequest = true,Fields
      = boost::beast::http::basic_fields<std::allocator<char> >] not viable: no kNown conversion from
      'framework::string_::fast_ostringstream' to 'std::ostream &' (aka 'basic_ostream<char> &') for 1st argument
operator<<(std::ostream& os,^
/BARXPBViewstore/GIT_Workspace/boost/boost_1_70_0/boost/beast/http/impl/write.hpp:901:1: note: candidate function [with Fields =
      boost::beast::http::basic_fields<std::allocator<char> >] not viable: no kNown conversion from 'framework::string_::fast_ostringstream'
      to 'std::ostream &' (aka 'basic_ostream<char> &') for 1st argument

解决方法

您的代码看起来很正常。实际上,它适用于标准字符串流:

Live On Coliru

#include <boost/beast/http.hpp>
#include <iostream>
#include <sstream>

namespace http = boost::beast::http;

#define PBLOG_INFO(a) do { std::clog << (a) << std::endl; } while(0);

int main() {
    std::string verb = "POST",req_str = "payload";
    using http::field;
    http::request<http::string_body> request;
    request.method_string(verb);
    request.target("server_endpoint");
    request.version(11);
    request.set(field::host,"hostname");
    request.set(field::accept,"*/*");
    request.set(field::authorization,"authorization_token");
    request.set(field::user_agent,"client_name");
    request.set(field::content_length,req_str.length());
    request.set(field::content_type,"application/x-www-form-urlencoded");
    request.set(field::connection,field::close);
    request.body() = req_str;
    request.prepare_payload();

    {
        std::ostringstream oss;
        oss <<"Request message " << request;
        PBLOG_INFO(oss.str());
        oss.clear();
    }
}

打印

Request message POST server_endpoint HTTP/1.1
Host: hostname
Accept: */*
Authorization: authorization_token
User-Agent: client_name
Content-Type: application/x-www-form-urlencoded
Connection: Close
Content-Length: 7
payload

问题出在哪里?

问题似乎是Beast的流运算符重载不适用于fast_ostringstream类型。这是设计使然:

  no known conversion from 'framework::string_::fast_ostringstream'
  to 'std::ostream &' (aka 'basic_ostream<char> &')

作者fast_ostringstream在某种程度上似乎是在作弊,但它绝对不是ostream&:)。

我试图通过创建自己的作弊流来得到类似的错误:

struct my_cheat_stream {
    using Device = boost::iostreams::back_insert_device<std::string>;
    using Stream = boost::iostreams::stream<Device>;

    std::string buf;
    Stream _impl { buf };

    template <typename T> my_cheat_stream& operator<<(T&& rhs) {
        _impl << std::forward<T>(rhs);
        return *this;
    }

    std::string&&    str()&& { _impl.flush(); return std::move(buf); }
    std::string_view str()&  { _impl.flush(); return buf; }

    void clear() {
        buf.clear();
        _impl.clear(std::ios::failbit|std::ios::badbit);
    }
};

但是it simply compiles,因为显然operator<< <T>()才适用。也许您可以相应地修复fast_ostringstream,或使用其他方法。

肮脏的解决方法:

您可以将上述反例用作杠杆:

template <typename Stream> struct wrap_non_std_stream {
    Stream& _wrapped;
    explicit wrap_non_std_stream(Stream& ref) : _wrapped(ref) {}

    template <typename T> auto& operator<<(T const& rhs) {
        _wrapped << rhs;
        return *this;
    }

    auto& operator<<(std::ostream&(*manip)(std::ostream&)) {
        _wrapped << manip;
        return *this;
    }
};

现在您应该能够

    fast_ostringstream oss;
    wrap_non_std_stream woss{oss};
    woss << "Request message " << request;

如果基础流运行,它还将支持操纵器:

    woss << std::endl << std::fixed << std::boolalpha << std::flush;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?