Версии и методы HTTP
HTTP/1 и HTTP/2
Начиная с v0.3.1, можно настроить версию HTTP. Если добавить Волгу вот так, по умолчанию используется HTTP/1:
[dependencies]
volga = { version = "..." }
Чтобы включить HTTP/2, добавьте функцию http2 или используйте full:
[dependencies]
volga = { version = "...", features = ["full"] }
При использовании full HTTP/2 применяется, если это возможно, иначе автоматически используется HTTP/1.
HTTP-методы
Для каждого стандартного глагола в Волге есть именованный метод map_* — он регистрируется на App или на RouteGroup:
app.map_get("/items", || async { ok!("list") });
app.map_post("/items", || async { ok!("created") });
app.map_put("/items/{id}", || async { ok!("updated") });
app.map_patch("/items/{id}", || async { ok!("patched") });
app.map_delete("/items/{id}", || async { ok!("deleted") });
app.map_head("/items", || async { ok!() });
app.map_options("/items", || async { ok!() });
app.map_trace("/items", || async { ok!() });
Совет
Запрос HEAD, у которого нет собственного маршрута, обрабатывается маршрутом GET для того же пути — через middleware и политику CORS этого маршрута, — поэтому map_head нужен только для собственной реализации. См. Свои обработчики HEAD, OPTIONS и TRACE.
Метод QUERY
Начиная с v0.9.4, Волга поддерживает HTTP-метод QUERY — безопасный идемпотентный глагол с телом запроса, для поисковых запросов, которые слишком велики или слишком структурированы для строки запроса URI.
Обработчик регистрируется через map_query():
use volga::{App, Json, ok};
use serde::Deserialize;
#[derive(Deserialize)]
struct SearchQuery {
criteria: String
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut app = App::new();
app.map_query("/search", |query: Json<SearchQuery>| async move {
// выполняем поиск по query.criteria...
ok!("search results...")
});
app.run().await
}
Проверить можно через curl:
> curl -X QUERY "http://localhost:7878/search" -H "Content-Type: application/json" -d '{"criteria":"volga"}'
Примечание
Не путайте map_query() с экстрактором Query<T>: первый регистрирует маршрут для глагола QUERY, второй читает строку запроса URI любого запроса.
Совет
Сложные критерии выборки лучше передавать в теле запроса QUERY. Параметры строки запроса стоит оставить для метаданных, влияющих на маршрутизацию и кеширование: тенант, локаль, версия, флаги, совместимость пагинации.
Произвольный метод
Также с v0.9.4 метод map() регистрирует маршрут для любого HTTP-метода. Это удобно, когда глагол известен только во время выполнения, когда один обработчик обслуживает несколько методов, или для нестандартных глаголов:
use volga::{App, ok};
use volga::http::Method;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut app = App::new();
app.map(Method::GET, "/hello", || async {
ok!("Hello, World!")
});
// строковый глагол и шаблон, собранный во время выполнения, тоже работают
app.map("QUERY", format!("/search/{}", "v1"), || async {
ok!("search results...")
});
app.run().await
}
Аргумент method принимает всё, что преобразуется в Method, включая строковые глаголы, а шаблон — как заимствованный &str (без аллокации), так и владеющий String, собранный во время выполнения.