#c #http #boost-asio
#c #http #повышение-asio
Вопрос:
Я пытаюсь получить JSON из REST API (пока блокировка в порядке), используя boost ::asio::read. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как поступить, если ответ состоит из нескольких кадров Ethernet. Когда это так, и я печатаю JSON, между фреймами есть какой-то «мусор», я не знаю, является ли это заполнением или некоторыми заголовками. Как мне это решить? Как я могу узнать, когда мне нужно читать и откуда мне нужно снова читать? Спасибо.
uint16_t port = 80; //TLS later?
std::string address = this->hostip_ ":" std::to_string(port);
//resolve address
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(hostip_, std::to_string(port));
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
//create socket
boost::asio::ip::tcp::socket socket(io_service);
try
{
boost::asio::connect(socket, endpoint_iterator);
}
catch (const std::exceptionamp; e)
{
std::cout << "Could not connect to API host";
return false;
}
//form the request
std::string hostAddress = hostip_ ":" std::to_string(port);
boost::asio::streambuf request;
std::ostream request_stream(amp;request);
request_stream << "GET " << restURI_ << " HTTP/1.1rn";
request_stream << "Host: " << hostAddress << "rn";
request_stream << "Accept: */*rn";
request_stream << "Connection: closernrn";
//send the request
boost::asio::write(socket, request);
//read the full response
boost::asio::streambuf response;
boost::system::error_code error;
while (boost::asio::read(socket, response,boost::asio::transfer_at_least(1), error));
//convert to string
boost::asio::streambuf::const_buffers_type buf = response.data();
const std::string bufferstr(boost::asio::buffers_begin(buf), boost::asio::buffers_begin(buf) response.size());
Комментарии:
1. Если вы подключаетесь через обычный сокет TCP, фреймы ethernet не могут быть видны или актуальны. Обо всем этом заботится стек TCP. Попробуйте записать, что именно считывается (и возвращается) каждым вызовом
asio::read
, прежде чем предположить, что что-то идет не так в другом месте.2. Хорошо, да, это обычный TCP … когда я смотрю через Wireshark, неожиданный материал находится между фреймами Ethernet, поэтому я предположил, что это должно быть связано с этим. Завтра я опубликую, что именно находится между ожидаемыми байтами.
Ответ №1:
Используйте Boost.Beast, переносимые HTTP, WebSocket и сетевые операции с использованием только C 11 и Boost.Asio !