我正在尝试使用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包是否从我这里抽象出这些问题?
如果我能提供其他信息以帮助您解答此问题,请与我们联系。提前谢谢!
答案 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"
* }
*/