使用大型身体

时间:2018-01-25 23:36:42

标签: c++ http post boost asio

我正在尝试使用boost :: asio向localhost发出一个同步的http POST请求:55001 /预测一个大的主体(大约8784000个字符)。我可以使用requests包在python中做到这一点。我的服务器能够很好地处理大型机身,所以我知道问题可能不在服务器端。

问题: 我根据boost :: asio POST请求的其他stackoverflow帖子设置了我的请求。这是我设置POST请求的主要代码块。编辑:我需要使用Boost,因为我的客户端不能使用C ++ 11。

features变量包含一个非常长的字符串(360 JSON表示为由&分隔的字符串)。

boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "POST " << /predict << " HTTP/1.1\r\n";
request_stream << "Host: " << localhost:55001 << "\r\n";
request_stream << "Content-Type: text/plain; charset=utf-8 \r\n";
request_stream << "Content-Length: " << features.length() << "\r\n";
request_stream << "Connection: close\r\n\r\n";
request_stream << features;

// Send the request
boost::asio::write(socket, request);

// Get the response
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");

我从服务器收到以下错误/响应:

  

返回状态代码为413的响应   libc ++ abi.dylib:以boost :: exception_detail :: clone_impl&gt;类型的未捕获异常终止:(1):期望值

Jetty服务器我发送请求抱怨HttpParser:HttpParser Full,这意味着请求很大。考虑到我能够使用Python的请求包发送完整的请求,我知道Jetty服务器肯定能够处理这种大小的请求。但是,这意味着我使用boost :: asio错误地打包了我的请求。

features只包含2个JSON(仍由&分隔)时,一切正常,响应中包含我期望的结果。

我怀疑这个问题是因为我向缓冲区写了太多数据,而且我需要在一个请求中发送几个缓冲区。此外,我想Python的请求包是在内部处理这些问题,这就是为什么python代码工作得很好。这是我用来在python中发送请求的行。

response = requests.post('http://localhost:55001/predict', data=features.encode('utf-8'))

1)有人可以解释如何使用boost :: asio在同步POST请求的请求体中发送大量数据吗?我不熟悉C ++,所以一个例子会有所帮助。

2)Python的Request包是否从我这里抽象出这些问题?

如果我能提供其他信息以帮助您解答此问题,请与我们联系。提前谢谢!

1 个答案:

答案 0 :(得分:0)

Boost很棒,但如果你要做的只是HTTP GET和POST方法(并且你使用的是C ++ 11),那么考虑像cpr C++ Requests这样的东西。它是一个包装libcurl的轻量级库,并且是在Python Requests项目之后建模的。

the documentation开始,这是一个发出POST请求的快速示例

#include <cpr/cpr.h>

auto r = cpr::Post(cpr::Url{"http://www.httpbin.org/post"},
                   cpr::Body{"This is raw POST data"},
                   cpr::Header{{"Content-Type", "text/plain"}});
std::cout << r.text << std::endl;

/*
 * {
 *   "args": {},
 *   "data": "This is raw POST data",
 *   "files": {},
 *   "form": {},
 *   "headers": {
 *     ..
 *     "Content-Type": "text/plain",
 *     ..
 *   },
 *   "json": null,
 *   "url": "http://www.httpbin.org/post"
 * }
 */