我试图了解如何使用Boost Beast库处理HTTP POST请求的内容。我对Boost Beast advanced server example进行了一些修改,以掌握一些东西。
在示例中,我已经在handle_request()方法中添加了以下几行(恰好在第155行之前):
if ( req.method() == http::verb::post)
{
std::cout << req << std::endl;
}
我创建了一个简单的测试文件foobar.dat,其中包含以下内容:
This is a test!
我使用以下curl命令将其发送到服务器:
curl -F 'test=@foobar.dat' http://localhost:8080
这将导致服务器的以下输出:
POST / HTTP/1.1Host: localhost:8080
User-Agent: curl/7.58.0
Accept: */*
Content-Length: 218
Content-Type: multipart/form-data; boundary=------------------------9c747f078ebbe880
--------------------------9c747f078ebbe880
Content-Disposition: form-data; name="test"; filename="foobar.dat"
Content-Type: application/octet-stream
This is a test!
--------------------------9c747f078ebbe880--
所以,我让服务器收到了预期的消息。
如果我将测试稍作修改,则可以将标头字段以及主体分别提取到一个大缓冲区中。
if ( req.method() == http::verb::post)
{
std::cout << "Fields:" << std::endl;
int field_count = 0;
for(auto const& field : req)
std::cout << "Field#"
<< ++field_count << " : " << field.name() << " = " << field.value() << std::endl;
std::cout << "Body:" << std::endl;
int body_count = 0;
for(auto it = boost::asio::buffer_sequence_begin(req.body().data());
it != boost::asio::buffer_sequence_end(req.body().data()); ++it)
{
// This is the next buffer in the sequence
boost::asio::const_buffer const buffer = *it;
std::string body(boost::asio::buffer_cast<const char*>(buffer));
std::cout << "Buffer#" << ++body_count << " = " << body << std::endl;
}
}
产生以下输出:
Fields:
Field#1 : Host = localhost:8080
Field#2 : User-Agent = curl/7.58.0
Field#3 : Accept = */*
Field#4 : Content-Length = 218
Field#5 : Content-Type = multipart/form-data; boundary=------------------------5510ea3ec81b8585
Body:
Buffer#1 = --------------------------5510ea3ec81b8585
Content-Disposition: form-data; name="test"; filename="foobar.dat"
Content-Type: application/octet-stream
This is a test!
--------------------------5510ea3ec81b8585--
我发现的大多数示例都演示了如何使用Boost Beast创建响应和请求,但是我找不到任何清晰的示例来说明如何解析内容并分离消息的各个组成部分。
具体来说,我如何使用Boost Beast从正文中提取并分离名称(“ test”),文件名(“ foobar.dat”)和文件内容(“ This is a test!”)。为了进一步处理消息?或者,在这一点上,是否有必要自己解析消息正文中的数据?