Добавление Rocket в наш проект
Что ж, теперь пришло время испачкать руки и добавить наш веб-фреймворк в наш проект. Мы будем использовать Rocket, потому что, на мой взгляд, это самый простой в освоении и применении ящик. Вы также можете проверить actix-web crate, который может быть очень хорошей альтернативой.
Для тех, кто не знаком с концепцией crates, это библиотеки (плагины, пакеты…), которые позволяют расширить функциональные возможности языка без необходимости изобретать колесо.
Если вы используете крейт cargo-edit
, вы можете просто ввести cargo add rocket
в терминале. В противном случае просто добавьте версию в ваш файл Cargo. Для этой статьи мы будем использовать версию 0.5.0-rc.2
. Ваш Cargo.toml теперь должен выглядеть следующим образом:
[package]
name = "web_server"
version = "0.1.0"
edition = "2021"
[dependencies]
rocket = "0.5.0-rc.2"
Все готово! Давайте начнем кодировать.
Давайте создадим наш первый маршрут
Настроить веб-сервер в Rust с помощью Rocket очень (очень) просто. Кто сказал, что Rust — это только низкоуровневый язык?
Давайте заменим содержимое нашего main.rs
и посмотрим, что произойдет.
#[macro_use]
extern crate rocket;
#[get("/health")]
fn healthcheck() -> &'static str {
"OK"
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![healthcheck])
}
Первые две строки позволяют нам использовать макросы Rocket, такие как get
или launch
. Вы должны быть знакомы с этим, если вы когда-нибудь занимались Rust. Вы также можете удалить эти строки и импортировать только те макросы, которые вам нужны.
Макрос get
превращает нашу простую функцию в конечную точку для нашего API. В качестве параметра он принимает строку, соответствующую пути к нашей конечной точке (обратите внимание, что этот маршрут может иметь префикс, как мы увидим ниже). Очевидно, что это не единственный макрос такого типа, и существуют другие, соответствующие всем HTTP-глаголам.
Обратите внимание, что маршрут может возвращать любой тип, реализующий признак Responder
. Он уже реализован для некоторых типов, таких как &str
, String
или Json
, но вы также можете реализовать его для своих собственных типов. Я рекомендую вам перейти на эту страницу, если вы хотите узнать больше о черте Responder
и ответах в целом.
Наконец, макрос launch
создает главную функцию, которая вызывает функцию launch
структуры, возвращенной функцией, к которой применен макрос. В этом случае сгенерированный код будет выглядеть следующим образом:
#[rocket::main]
async fn main() {
let _ = rocket().launch().await;
}
Наконец, что касается самой функции rocket()
, то она просто монтирует маршруты, переданные в качестве параметров, с префиксом указанного пути. Обратите внимание, что вполне возможно вызвать функцию mount
несколько раз, если мы хотим смонтировать разные маршруты с разными префиксами (у нас будет возможность вернуться к этому позже в этой серии статей).
Теперь мы можем запустить сервер, набрав команду cargo run
в терминале, и увидеть следующие строки, говорящие нам об успешном запуске сервера.
Configured for debug.
>> address: 127.0.0.1
>> port: 1234
>> workers: 8
>> ident: Rocket
>> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB
>> temp dir: C:UsersThibautAppDataLocalTemp
>> http/2: true
>> keep-alive: 5s
>> tls: disabled
>> shutdown: ctrlc = true, force = true, grace = 2s, mercy = 3s
>> log level: debug
>> cli colors: true
Routes:
>> (healthcheck) GET /health
Fairings:
>> Shield (liftoff, response, singleton)
registering event source with poller: token=Token(0), interests=READABLE | WRITABLE
Shield:
>> X-Frame-Options: SAMEORIGIN
>> Permissions-Policy: interest-cohort=()
>> X-Content-Type-Options: nosniff
Rocket has launched from http://127.0.0.1:1234
Перейдите в браузере по указанному адресу (не забыв добавить путь к нашей конечной точке), и вы должны увидеть желаемое содержимое, которое будет «OK».
Изменение конфигурации с помощью файла Rocket.toml
Может быть, вы хотите настроить свой сервер Rocket на работу на другом порту, с более высоким или низким уровнем журнала или изменить количество рабочих? Возможно, вы также хотите иметь различные конфигурации в зависимости от среды, в которой развернуто приложение? Хорошая новость, для этого существует файл Rocket.toml
.
В этом файле вы можете указать, как запустить ваш сервер и настроить его по профилю. Вы также можете иметь конфигурации по умолчанию или, наоборот, конфигурации, перезаписывающие все остальные значения.
Вот пример конфигурации. Все доступные поля можно найти в документации.
[debug]
address = "127.0.0.1"
port = 1234
log_level = "debug"
В следующей статье мы сделаем еще один шаг вперед и добавим систему аутентификации на наш сервер!