Rust + Warp 5가 포함된 REST API: 테스트 유틸리티를 넘어서

6432 단어 rustrestwarpapi
마지막 부분입니다, 여러분!


이젠 헤어질 시간. 워프 5.



The code for this part is available .



Warp의 테스트 유틸리티는 훌륭하지만 빌드된 것을 실제로 제공할 수 없고 이에 대항하여curl 이 시리즈를 끝내고 싶지 않았습니다.

그러기 위해 먼저 /src/bin/main.rs 파일을 만들었습니다. 그런 다음 다음을 추가하기 위해 변경했습니다Cargo.toml.

[[bin]]
name = "holodeck"
path = "src/bin/main.rs"

[lib]
name = "holodeck"
path = "src/lib.rs"


처음에 언급했듯이 테스트 유틸리티를 사용하여 테스트하는 것보다 API를 제공하고 사용하는 코드의 예를 찾는 것이 더 쉽습니다. 그래서 나는 그 위로 날아갈 것입니다.

main.rs는 다음과 같이 끝났습니다.

// I made "models" and "filters" public in lib.rs
use holodeck::{ models, filters };
use warp::Filter;

#[tokio::main]
async fn main() {

    let db = models::new_db();
    let routes = filters::list_sims(db.clone())
        .or(filters::post_sim(db.clone()))
        .or(filters::update_sim(db.clone()))
        .or(filters::delete_sim(db));

    warp::serve(routes).run(([127, 0, 0, 1], 3030)).await;
}


그리고 그게 다야! or를 사용하여 필터를 결합하고 제공해야 했습니다. 클론이 작동하는 이유는 Arc 를 복제하기 때문에 새 복사본이 생성되지 않고 Mutex 에 대한 새 참조가 생성되기 때문입니다.

아래에서 내가 만든 몇 가지curl를 찾을 수 있습니다.
POST
curl --location --request POST 'localhost:3030/holodeck' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
    "id": 1,
    "name": "The Big Goodbye"
}'

curl --location --request POST 'localhost:3030/holodeck' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
    "id": 2,
    "name": "Bride Of Chaotica!"
}'

PUT
curl --location --request PUT 'localhost:3030/holodeck/3' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
    "name": "A Fistful Of Datas"
}'

curl --location --request PUT 'localhost:3030/holodeck/3' \
--header 'Content-Type: application/json' \
--header 'Content-Type: text/plain' \
--data-raw '{
    "name": "A Fistful Of La Forges"
}'

GET
curl --location --request GET 'localhost:3030/holodeck'

curl --location --request GET 'localhost:3030/holodeck/2'

DELETE
curl --location --request DELETE 'localhost:3030/holodeck/1' 


warp의 테스트 유틸리티를 사용하는 것의 좋은 점은 빌드한 것을 제공할 때 추가 노력이 필요하지 않다는 것입니다. 리팩토링이 없습니다. 따라서 테스트를 사용하는 경우 일부 curl 도 시도하는 것이 좋습니다. 다음은 내가 할 때 발견한 몇 가지 문제입니다.
  • 어느 시점에서 나는 내 warp::get()에서 list_sims()를 삭제했고 결과적으로 내가 한 모든 요청에 ​​응답했습니다.
  • PUT의 직렬화/역직렬화가 제대로 작동하지 않았습니다. 이것이 테스트에 나타나지 않았기 때문에 나는 serde가 그 일을 너무 잘해서 결국 내가 코드에서 저지른 실수를 숨길 것이라고 생각했습니다.
  • 응답 삭제의 상태는 올바르지만 작성된 메시지가 잘못되었습니다.





  • 어떤 여행을! 나는 그것이 다른 누군가에게 유용하게 끝나기를 정말로 바랍니다.

    당신을 보내기 전에 이곳에 지어진 것과 관련하여 좋지 않은 것들에 대해 경고하기 위해 작은 쿨파를 쓰고 싶습니다.

    나의 주요 목표는 결과가 아닌 과정을 보여주는 것이었습니다. 완성된 코드를 게시하고 이를 설명하는 텍스트를 작성하고 싶지 않았습니다. 이 선택에 만족하지만 몇 가지 단점이 있습니다. 더 명확하게 하기 위해 독자가 이전 코드를 확인하여 이해하도록 하는 너무 많은 기능을 만들고 사용하지 않았습니다. 따라서 다음 사항은 좋지 않습니다.
  • 코드 반복이 문제 번호 1입니다. 테스트는 동일한 시뮬레이션을 생성하고 도처에 반복되는use 키워드 등이 있습니다.
  • HashMap을 강제로 적용해서 '자연스럽다'는 느낌이 전혀 들지 않았습니다. 특성 구현을 보여줄 수 있는 기회를 제공했기 때문에 후회하지는 않지만 종종 약간의 번거로움이 있었습니다.
  • Warp는 빌딩 블록을 제공합니다. 즉, 동일한 작업을 수행하는 여러 가지 방법이 있으며 일부는 다른 것보다 낫습니다. 나는 그렇게 많이 강조하지 않았고 종종 가장 쉬운 방법을 사용했습니다.
  • 테스트는 실제로 확인해야 할 모든 것을 확인하는 것과는 거리가 멀다.

  • 그리고 충분하다고 생각합니다. 진짜! 시간을 내주셔서 감사합니다.

    장수와 번영!

    🖖

    좋은 웹페이지 즐겨찾기