Rust
Железная веб-платформа
Поиск…
Вступление
Простой сервер «Hello»
Этот пример отправляет жестко запрограммированный ответ пользователю при отправке запроса сервера.
extern crate iron;
use iron::prelude::*;
use iron::status;
// You can pass the handler as a function or a closure. In this
// case, we've chosen a function for clarity.
// Since we don't care about the request, we bind it to _.
fn handler(_: &mut Request) -> IronResult<Response> {
Ok(Response::with((status::Ok, "Hello, Stack Overflow")))
}
fn main() {
Iron::new(handler).http("localhost:1337").expect("Server failed!")
}
При создании нового Iron
Server в этом примере expect
чтобы поймать любые ошибки с более описательным сообщением об ошибке. В производственных приложениях обрабатывайте полученную ошибку (см. Документацию по http()
).
Установка железа
Добавьте эту зависимость в файл Cargo.toml
:
[dependencies]
iron = "0.4.0"
Запустите cargo build
и Cargo загрузит и установит указанную версию Iron.
Простая маршрутизация с использованием железа
Этот пример обеспечит базовую маршрутизацию через Iron.
Для начала вам нужно добавить зависимость Iron от вашего файла Cargo.toml
.
[dependencies]
iron = "0.4.*"
Мы будем использовать собственную библиотеку Router от Iron. Для простоты проект Iron предоставляет эту библиотеку в составе библиотеки ядра Iron, что устраняет необходимость добавления ее в качестве отдельной зависимости. Затем мы ссылаемся как на библиотеку Iron, так и на библиотеку Router.
extern crate iron;
extern crate router;
Затем мы импортируем требуемые объекты, чтобы мы могли управлять маршрутизацией и возвращать ответ пользователю.
use iron::{Iron, Request, Response, IronResult};
use iron::status;
use router::{Router};
В этом примере мы сохраним это просто, написав логику маршрутизации в нашей функции main()
. Конечно, по мере роста вашего приложения вы захотите разделить маршрутизацию, протоколирование, проблемы безопасности и другие области вашего веб-приложения. На данный момент это хорошая отправная точка.
fn main() {
let mut router = Router::new();
router.get("/", handler, "handler");
router.get("/:query", query_handler, "query_handler");
Давайте перейдем к тому, чего мы достигли до сих пор. Наша программа в настоящее время создает новый объект Iron Router
и прикрепляет два «обработчика» к двум типам URL-запроса: первый ( "/"
) является корнем нашего домена, а второй ( "/:query"
) - это любой путь под root.
Используя слово «запрос» с запятой перед словами «запрос», мы говорим Желу, чтобы взять эту часть пути URL как переменную и передать ее в наш обработчик.
Следующая строка кода - это то, как мы создаем экземпляр Iron, обозначая наш собственный объект router
для управления нашими запросами URL. Домен и порт жестко закодированы в этом примере для простоты.
Iron::new(router).http("localhost:3000").unwrap();
Затем мы объявляем две встроенные функции, которые являются нашими обработчиками, handler
и query_handler
. Они используются для демонстрации фиксированных URL-адресов и переменных URL-адресов.
Во второй функции мы берем переменную "query"
из URL-адреса, хранящегося объектом запроса, и мы отправляем ее обратно пользователю в качестве ответа.
fn handler(_: &mut Request) -> IronResult<Response> {
Ok(Response::with((status::Ok, "OK")))
}
fn query_handler(req: &mut Request) -> IronResult<Response> {
let ref query = req.extensions.get::<Router>()
.unwrap().find("query").unwrap_or("/");
Ok(Response::with((status::Ok, *query)))
}
}
Если мы запустим этот пример, мы сможем просмотреть результат в веб-браузере на localhost:3000
. Корень домена должен отвечать "OK"
, и все, что находится под корнем, должно повторить путь назад.
Следующим шагом в этом примере может быть разделение маршрутизации и обслуживание статических страниц.