Мы выпустили RESTinio 0.6.1!
2019.11.13
Эта версия содержит вспомогательные инструменты для упрощения работы с HTTP-полями.
В предыдущих версиях в RESTinio были только средства проверки наличия конкретного HTTP-поля и получения этого поля в первоначальном, еще неразобранном виде. Проверка корректности формата значения поля и разбор значения на отдельные составляющие ложилась на самого пользователя.
Начиная с версии 0.6.1 RESTinio предоставляет ряд вспомогательных средств, которые выполняют разбор содержимого HTTP-полей. Например, вот так теперь можно получить доступ к содержимому поля Content-Type:
#include <restinio/all.hpp>
#include <restinio/helpers/http_field_parsers/content-type.hpp>
...
auto on_request(const restinio::request_handle_t & req) {
namespace hfp = restinio::http_field_parsers;
// Get the content of Content-Type field and parse it.
const auto content_type = hfp::content_type_value_t::try_parse(
// value_of will throw if there is no Content-Type.
req->header().value_of(restinio::http_field::content_type));
if(content_type) {
// Now we can access values of Content-Type directly.
if("text" == content_type->media_type.type &&
"plain" == content_type->media_type.subtype) {
// It is text/plain content. Try to detect charset for it.
const auto charset = hfp::find_first(
content_type->media_type.parameters,
"charset");
if(charset) {
... // Handling existing charset value.
}
else {
... // Handling missing charset value.
}
... // Some processing.
}
else if("application" == content_type->media_type.type &&
"json" == content_type->media_type.subtype) {
// It is application/json content.
... // Some processing.
}
}
else {
// There is some error with parsing of Content-Type value.
... // Some error handling code.
}
}
В версии 0.6.1 таким образом реализована поддержка HTTP-полей Accept, Cache-Control, Content-Encoding, Content-Disposition, Content-Type. Средства разбора других HTTP-полей будут добавляться в последующих версиях RESTinio. Вы можете повлиять на скорость этого процесса если сообщите нам, поддержку каких HTTP-полей вы хотели бы видеть в RESTinio в первую очередь.
С помощью этих средств в RESTinio был добавлен набор вспомогательных функций для работы с multipart телами запросов. Так, в версии 0.6.1 пройтись по всем частям multipart тела можно посредством вспомогательной функции enumerate_parts из пространства имен restinio::multipart_body:
#include <restinio/all.hpp>
#include <restinio/helpers/multipart_body.hpp>
...
auto on_post(const restinio::request_handle_t & req) {
using namespace restinio::multipart_body;
const auto result = enumerate_parts( *req,
[](parsed_part_t part) {
... // Some actions with the current part.
return handling_result_t::continue_enumeration;
},
"multipart", "form-data" );
if(result) {
... // Producing positive response.
}
else {
... // Producing negative response.
}
return restinio::request_accepted();
}
Одно из применений запросов с multipart телами -- это загрузка файлов на сервер. RESTinio 0.6.1 предлагает средства для упрощения реализации этой операции (но сама реализация все-таки остается задачей пользователя). Вспомогательная функция enumerate_parts_with_files из пространства имен restinio::file_upload позволяет перечислить все части multipart тела, в которых выполняется загрузка файла согласно RFC1867:
#include <restinio/all.hpp>
#include <restinio/helpers/file_upload.hpp>
...
auto on_post(const restinio::request_handle_t & req) {
using namespace restinio::file_upload;
const auto result = enumerate_parts_with_files( *req,
[](part_description_t part) {
... // Some actions with the current uploaded file.
return handling_result_t::continue_enumeration;
} );
if(result) {
... // Producing positive response.
}
else {
... // Producing negative response.
}
return restinio::request_accepted();
}
В состав штатных примеров RESTinio теперь входит пример file_upload, который демонстрирует простой сценарий использования enumerate_parts_with_files.
Мы старались сделать все эти возможности максимально удобными для наших пользователей. Но мы понимаем, что это самая первая версия новой функциональности, возможны какие-то огрехи и недочеты. Поэтому мы приглашаем всех заинтересовавшихся попробовать новую версию RESTinio и поделиться с нами своими впечатлениями.
Новая версия RESTinio доступна в основном репозитории на github, а так же через системы управления зависимостями vcpkg и conan.
Документация находится здесь.
Также доступна Doxygen документация: RESTinio-0.6 API Reference.
Если вам чего-то не хватает в RESTinio и вы хотели бы увидеть в RESTinio нужную вам функциональность, то можете сообщить нам об этом через Issues на github или Google-группу, либо же написав на info@stiffstream.com. Вы так же можете заказать у нас доработку RESTinio под свои нужды.