로켓 튜토리얼 01: 기초

Jean-Philippe Delberghe Unsplash에서 촬영한 사진, 수정(재단)
이 시리즈에서는 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을 매개 변수로 합니다.
  • 우리는 하나의 지령으로 모든 루트를 장식한다. 이 지령은 루트의 HTTP 방법(이 예에서 GET), 루트 자체의 주소와 파라미터를 설명한다.매개변수는 <>에서 지정되며 함수의 매개변수 이름과 일치해야 합니다.
  • 함수는 String과 페이지 본문을 되돌려줍니다.
  • 마지막으로, main()에서 우리는 로켓 엔진에 불을 붙이고, 그 엔진으로 통하는 모든 노선을 설치했다.그 후에 우리는 로켓 (즉 서버 시작) 을 가동했다.
  • 이제 브라우저를 http://localhost:8000으로 가리키겠습니다.루트(/) 라우팅을 설정하지 않으므로 Rocket의 404 페이지를 받습니다.

    /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은 보안 처리 프로그램(helmethelmetjs과 유사), 데이터베이스 연결과 탱크, 그리고 두 개의 서로 다른 템플릿 엔진 terahandlebars, 그리고 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 서버를 만드는 방법을 볼 수 있습니다.기대해주세요!

    좋은 웹페이지 즐겨찾기