Доступ к REST API в качестве клиента на c с повышением, проблема с фреймингом ethernet

#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 !