로켓 튜토리얼 01: 기초
이 시리즈에서는 Rocket을 사용하여 Rust 서버를 만드는 방법을 모색합니다.
이 강좌의 코드는 이 저장소에서 찾을 수 있습니다: github.com/davidedelpapa/rocket-tut
git clone https://github.com/davidedelpapa/rocket-tut.git
cd rocket-tut
git checkout tags/tut1
설치 프로그램
첫 번째 일로 우리는 새로운 프로젝트를 창설한다
cargo new rocket-tut
cd rocket-tut
이 항목의 기본값 rustup
을 덮어쓰고 야간에 Rust를 사용해야 합니다.rustup override set nightly
우리는 cargo edit 판자 상자의 cargo add
을 사용할 것입니다. (만약 당신이 없다면 cargo install cargo-edit
만 실행하면 됩니다.)cargo add rocket
사실 우리 화물의 [dependencies]
부분.toml은 다음과 같이 해야 합니다.[dependencies]
rocket = "0.4.5"
대단히 좋다기본 src/main을 바꾸겠습니다.rs에는 다음과 같은 내용이 있습니다.
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] use rocket::*;
#[get("/echo/<echo>")]
fn echo_fn(echo: String) -> String {
format!("{}", echo)
}
fn main() {
rocket::ignite().mount("/", routes![echo_fn]).launch();
}
코드를 신속하게 분석합니다.#[macro_use]
의 지령이 있는 로켓판 상자를 사용할 것이다.echo_fn()
이다.이 함수는 String
을 매개 변수로 합니다.GET
), 루트 자체의 주소와 파라미터를 설명한다.매개변수는 <>
에서 지정되며 함수의 매개변수 이름과 일치해야 합니다.String
과 페이지 본문을 되돌려줍니다.main()
에서 우리는 로켓 엔진에 불을 붙이고, 그 엔진으로 통하는 모든 노선을 설치했다.그 후에 우리는 로켓 (즉 서버 시작) 을 가동했다./echo/:
http://localhost:8000/echo/test
우리의 페이지는 우리가 메아리 뒤에 놓은 같은 텍스트로 우리를 맞이한다/
메아리 루트가 작업 중입니다!
너무 좋아요.
정적 파일 제공
지금 무엇을 할 수 있는지 봅시다.예를 들어 우리는 정적 파일 서버를 만들 수 있다.
이제 Cargo Watch부터 시작하겠습니다(설치되지 않은 경우:
cargo install cargo-watch
)cargo watch -x run
폴더static/를 만들고 이미지 파일을 추가합니다.이제 다음 내용을 src/main에 추가합니다.루피:
use std::path::{Path, PathBuf};
#[macro_use] use rocket::*;
use rocket::response::NamedFile;
우리는 표준 라이브러리의 함수를 사용하여 파일 시스템을 처리할 것이다.동시에, 우리는 rocket의
NamedFile
응답을 사용하여 파일을 제공한다다음으로, 우리는 새로운 파일 서비스 루트를 추가했다.
#[get("/file/<file..>")]
fn fileserver(file: PathBuf) -> Option<NamedFile> {
NamedFile::open(Path::new("static/").join(file)).ok()
}
이 루트는 파라미터를 PathBuf
으로 변환합니다. 이것은 파일 시스템을 지우고 서버 내부에서 파일을 가져올 수 있는 오류가 없음을 보장합니다.join
저희가 방금 만든 정적/폴더의 Path
경로입니다.마지막으로 라우팅 목록을 업데이트하고
fileserver
함수를 추가해야 합니다.fn main() {
rocket::ignite().mount("/", routes![echo_fn, fileserver]).launch();
}
모든 것이 간단하다.더 쉬운 방법도 있어.명령줄에 상자
rocket-contrib
을 추가합니다.cargo add rocket_contrib
이제 src/main을 업데이트합시다.rs - 다음:#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] use rocket::*;
use rocket_contrib::serve::StaticFiles;
#[get("/echo/<echo>")]
fn echo_fn(echo: String) -> String {
format!("{}", echo)
}
fn main() {
rocket::ignite()
.mount("/", routes![echo_fn])
.mount("/files", StaticFiles::from("static/"))
.launch();
}
보시다시피 저희는 현재 rocket_contrib
의 모듈을 사용하고 있습니다. 서비스::StaticFiles.이것이 바로 문서 서비스의 더러운 일이다.우리는 as mount point "/파일"을 사용한 것을 알 수 있습니다. (이전에는
/
+ file
-> /file
).정적/폴더에서 파일을 계속 가져옵니다(StaticFiles::from()
)그것을 실행하면 우리는 그것의 유효성을 볼 수 있다.
서버 보호
만약 우리가
rocket_contrib
에서 모든 기본값을 얻었다면, 우리는 파일 서버와 JSON에 대한 지원을 가질 것이다. (잠시 후에 약간의 지원이 있을 것이다.)그러나
rocket_contrib
은 보안 처리 프로그램(helmet
은 helmetjs
과 유사), 데이터베이스 연결과 탱크, 그리고 두 개의 서로 다른 템플릿 엔진 tera과 handlebars, 그리고 uuid
함수를 가지고 있다.helmet
으로 코드를 보호하자!rocket_contrib
기능 업데이트:cargo add rocket_contrib --features helmet
파일 서버를 걱정하지 마십시오. 기본값을 제외하지 않으면 존재합니다.이제 코드를 보호합시다.
SpaceHelmet
이후에 rocket
을 가져옵니다.use rocket_contrib::helmet::SpaceHelmet;
우리는 로켓에 불을 붙인 후에 그것을 사용할 것이다.fn main() {
rocket::ignite()
.attach(SpaceHelmet::default())
.mount("/", routes![echo_fn])
.mount("/files", StaticFiles::from("static/"))
.launch();
}
Here 헬멧에 설정된 기본 제목 목록을 볼 수 있습니다.이렇게 하면 우리의 제목을 매우 쉽게 보호할 수 있다.
서버 테스트
첫 번째 강좌를 끝내기 전에 우리 서버를 어떻게 테스트하는지 봅시다.조심해, 이건 간단해, 로켓 과학이 아니야!
우선, 우리는 로켓 실례의 창설을 고려한다.
Rocket 인스턴스를 초기화하고 준비하는 데 사용할 함수
rocket()
을 만들었습니다. 시작할 필요가 없습니다.이 함수는 이 Rocket 인스턴스를 반환합니다.fn rocket() -> rocket::Rocket {
rocket::ignite().attach(SpaceHelmet::default())
.mount("/", routes![echo_fn])
.mount("/files", StaticFiles::from("static/"))
}
현재 우리는 main()
에서 이 실례를 호출해야 한다. fn main() {
rocket().launch();
}
이것은 우리의 지난번 배치와 완전히 같다. 단지 이런 방식을 통해 우리는 main()
이외에 테스트 목적에 사용되는 로켓 실례를 만들 수 있다.현재 우리는 src/main의 끝에 테스트를 추가해야 합니다.루피:
#[cfg(test)]
mod test {
use super::rocket;
use rocket::local::Client;
use rocket::http::Status;
#[test]
fn echo_test() {
let client = Client::new(rocket()).expect("Valid Rocket instance");
let mut response = client.get("/echo/test_echo").dispatch();
assert_eq!(response.status(), Status::Ok);
assert_eq!(response.body_string(), Some("test_me".into()));
}
}
super::rocket
을 사용하면 실례를 초기화하기 위해 rocket()
함수를 얻을 수 있습니다테스트 함수
echo_test()
을 정의했습니다. 먼저 클라이언트를 설정하여 서버를 문의합니다.우리가 테스트한 첫 번째 일은 사실 우리 excpect()
이 로켓의 유효한 실례이다!그리고 우리는 루트
GET
에서 서버에 echo/
요청을 보내고 "test\uecho"파라미터를 보냅니다.우리는 response
을 저장한다.우리는 두 가지 일을 테스트했다. 첫 번째는 응답 상태가
Ok
(즉 400
)이다.두 번째는 응답의 주체가 우리echo 매개 변수와 일치해야 한다는 것이다.이 경우 코드 설정이 실패했습니다. "test\uecho"를 매개 변수로 보냈고, "test\u me"를 테스트하고 있기 때문입니다.
cargo test
을 사용하여 빠른 실행을 하려면 실제로 테스트 실패를 되돌려야 합니다.cargo test
....
thread 'test::echo_test' panicked at 'assertion failed: `(left == right)`
left: `Some("test_echo")`,
right: `Some("test_me")`', src/main.rs:33:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
test::echo_test
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--bin rocket-tut'
코드 assert_eq!(response.body_string(), Some("test_echo".into()));
을 조금만 조정하면 테스트가 순조롭게 실행됩니다.running 1 test
test test::echo_test ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
결론
자, 오늘은 여기까지.
우리는 로켓의 기본적인 사용법,
rocket_contrib
으로 진행되는 안전 보호, 그리고 테스트를 어떻게 실행하는지 소개했다.다음 호에서는 CRUD 서버를 만드는 방법을 볼 수 있습니다.기대해주세요!
Reference
이 문제에 관하여(로켓 튜토리얼 01: 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/davidedelpapa/rocket-tutorial-01-basics-4ph9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)