Rocket/README.md

96 lines
3.3 KiB
Markdown
Raw Normal View History

2016-09-12 08:46:08 +00:00
# Rocket [![Build Status](https://travis-ci.com/SergioBenitez/Rocket.svg?token=CVq3HTkPNimYtLm3RHCn&branch=master)](https://travis-ci.com/SergioBenitez/Rocket)
2016-04-05 02:04:46 +00:00
2016-03-12 18:54:38 +00:00
Rocket is a work-in-progress web framework for Rust (nightly) with a focus on
2016-04-06 19:50:51 +00:00
ease-of-use, expressability, and speed. Here's an example of a complete Rocket
application:
2016-03-12 18:54:38 +00:00
```rust
#![feature(plugin)]
2016-09-09 03:38:58 +00:00
#![plugin(rocket_codegen)]
2016-03-12 18:54:38 +00:00
extern crate rocket;
2016-03-15 03:46:55 +00:00
use rocket::Rocket;
2016-03-12 18:54:38 +00:00
2016-09-04 11:10:35 +00:00
#[get("/<name>/<age>")]
2016-04-06 19:50:51 +00:00
fn hello(name: &str, age: u8) -> String {
2016-04-03 11:28:09 +00:00
format!("Hello, {} year old named {}!", age, name)
2016-03-12 18:54:38 +00:00
}
fn main() {
Rocket::new("localhost", 8000).mount_and_launch("/hello", routes![hello]);
2016-03-12 18:54:38 +00:00
}
```
2016-04-06 19:50:51 +00:00
Visiting `localhost:8000/hello/John/58`, for example, will trigger the `hello`
route resulting in the string `Hello, 58 year old named John!` being sent to the
browser. If an `<age>` string was passed in that can't be parsed as a `u8`, the
route won't get called, resulting in a 404 error.
2016-09-13 23:32:57 +00:00
## Overview
Rocket employs code generation to remove the need for boilerplate involved with
parsing requests and request parameters, prevent invalid and/or incorrect
requests from invoking a user's request handler, and allow the user to define
what is valid and/or correct.
Rocket uses type _guards_, or _constraints_, on request handlers to
accomplishing it's safety and correctness goals. In Rocket, handlers are _only_
invoked if all types that appear in the request handler's argument list can be
derived from the incoming request.
In their simplest incarnation, guards can be types expected of parameters in a
matched path. This is illustrated in the previous example where the `hello`
request handler is only be invoked if the dynamic path parameter `<age>` parses
as a `u8`. Guards can also be derived directly from a request. For instance, you
can define an `AdminUser` type that can be derived only if the proper cookies
were sent along with the request. Then, by simply including the type in a
handler's argument list as follows:
#[get("/admin/post/<id>")]
fn admin(user: AdminUser, id: isize) -> { .. }
you can be assured that the handler will be invoked _only_ if an administrative
user is logged in. Any number of such guards can be included. For example, to
retrieve the request's cookies along with the admin user, simply include the
`&Cookies` type in the argument list:
#[get("/admin/post/<id>")]
fn admin(user: AdminUser, cookies: &Cookies, id: isize) -> { .. }
Full documentation about built-in request guards is coming soon.
2016-09-04 22:07:47 +00:00
## Building
### Nightly
2016-03-12 18:54:38 +00:00
Rocket requires a nightly version of Rust as it makes heavy use of syntax
extensions. This also means that the first two unwieldly lines in the Rust file
above are required.
2016-09-04 22:07:47 +00:00
### Examples
2016-03-12 18:54:38 +00:00
Try running the examples in the `examples/` folder. For instance, the following
2016-04-06 19:50:51 +00:00
sequence of commands builds and runs the `Hello, world!` example:
2016-03-12 18:54:38 +00:00
```
2016-04-06 19:50:51 +00:00
cd examples/hello_world
2016-03-12 18:54:38 +00:00
cargo run
```
2016-04-06 19:50:51 +00:00
Then visit `localhost:8000`. You should see `Hello, world!`.
2016-03-12 18:54:38 +00:00
### OS X
Apple has stopped shipping `openssl` with OS X.11. As such, if your build fails
2016-04-06 19:50:51 +00:00
to compile with some `openssl` related errors, you'll need to install `openssl`,
`cargo clean`, and then `cargo build` again. Here are some lightweight
instructions:
2016-03-12 18:54:38 +00:00
```
brew install openssl
brew link --force openssl
export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
```