#rocket #versioning #rocket-web #version #api #web-apps

rocket-versioning

为 rocket Web 应用程序提供 API 版本管理

1 个不稳定版本

0.1.0 2021 年 7 月 23 日

#1225 in HTTP 服务器

MIT/Apache

7KB
78

rocket-versioning

为 rocket Web 应用程序提供 API 版本管理

安装

示例

#[macro_use] extern crate rocket;

use rocket::local::blocking::Client;
use rocket::http::{Header, Status};

use super::Versioning;

#[get("/versioning", rank = 4)]
fn versioning(_v: Versioning<1, 0>) -> String {
    "v1.0".to_string()
}

#[get("/versioning", rank = 3)]
fn versioning_1_1(_v: Versioning<1, 1>) -> String {
    "v1.1".to_string()
}

#[get("/versioning", rank = 2)]
fn versioning_2_1(_v: Versioning<2, 1>) -> String {
    "v2.1".to_string()
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![versioning, versioning_1_1, versioning_2_1])
}

#[test]
fn test_versioning() {
    let client = Client::tracked(rocket()).expect("invalid rocket instance");
    // NOTICE: version should be `Major.Minor.Patch`, and patch will be ignored.
    // see: https://docs.rs/semver/1.0.3/semver/struct.Version.html#errors
    let response = client.get("/versioning").header(Header::new("Api-Version", "1.0.0")).dispatch();
    assert_eq!(response.status(), Status::Ok);
    assert_eq!(response.into_string().unwrap(), "v1.0");

    let response = client.get("/versioning").header(Header::new("Api-Version", "1.1.0")).dispatch();
    assert_eq!(response.status(), Status::Ok);
    assert_eq!(response.into_string().unwrap(), "v1.1");

    let response = client.get("/versioning").header(Header::new("Api-Version", "2.1.0")).dispatch();
    assert_eq!(response.status(), Status::Ok);
    assert_eq!(response.into_string().unwrap(), "v2.1");

    let response = client.get("/versioning").header(Header::new("Api-Version", "2.0.0")).dispatch();
    assert_eq!(response.status(), Status::NotFound);
}

注意

头部中的版本应为 主版本.次版本.修订版,修订版将被忽略。请参阅(不受支持)https://docs.rs/semver/1.0.3/semver/struct.Version.html#errors 版本格式。

依赖关系

~15–47MB
~788K SLoC