#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));
Рад услышать лучшие решения.