boost::beast:: http:: запрос отправки файла как составного / form-data

#boost-beast

#boost-зверь

Вопрос:

Просто приступаю к этому, используя http_client_sync.cpp . Я добавил немного кода для использования http::file_body типа.

Кажется, я не могу понять, как вставить составные границы. Есть ли что-то конкретное, что мне нужно сделать, чтобы это произошло? Когда я смотрю на сообщение в wireshark, все данные multipart / form находятся в одной большой части. Соответствующий (я надеюсь) фрагмент ниже. Изменено из oroginal http_client_sync.cpp .

         // Set up an HTTP POST request message
        http::request<http::file_body> req{http::verb::post, target, version};
        // use the full host:port here
        req.set(http::field::host, fullhost.c_str());
        req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
        req.set(http::field::accept,"*/*");
        req.set(http::field::content_length,contentLen);
        req.set(http::field::content_type,"multipart/form-data; boundary=fd1c38d86c0a42ac933e7319e51882fd");

        req.body() = std::move(body);

        http::request_serializer<http::file_body,  http::fields> sr{req};

        // Send the HTTP request to the remote host
        http::write(socket, sr);
          
 

Я тоже пробовал это, но результат был тот же

         size_t len = http::write_header(socket, sr);
        while(len!=0)
        {
            len = http::write_some(socket, sr);
        }

 

Сервер, с которым я разговариваю, ожидает несколько частей.

Большое спасибо

Комментарии:

1. Мне интересно, нужно ли мне создавать пользовательский сериализатор? Не нахожу четкого примера того, как это сделать.

Ответ №1:

Хорошо, оказывается, это возможно, и вылечил мою проблему. Вероятно, это не «правильный» способ сделать это, но он работает.

         size_t len = http::write_header(socket, sr);
        
        // where multipart header is a string containing the first boundary
        // and the content disposition
        boost::asio::write(socket,boost::asio::buffer( multipartHeader));

        while(len!=0)
        {
            len = http::write_some(socket, sr);
        }
        // where multipart trailer is a string containing the final boundary
        boost::asio::write(socket,boost::asio::buffer( multipartTrailer));

 

Рад услышать лучшие решения.