1 个不稳定版本

0.1.0 2023 年 5 月 4 日

#1319HTTP 服务器

MIT 许可证

46KB
862

卡坦
一种简单地向服务器发出请求的方式

crate docs

卡坦是用于向服务器发出请求的。已经存在许多这样的库。为什么选择这个呢?

  • 包含所有必要的组件。无需设置 Hyper + Serde + Bytes + 等(再次)。
  • 可以从响应中自动保存cookie等,这有助于登录,然后发出后续请求。
  • 可以在发出多个请求之前预先设置使用头、查询 URL、cookie。

这还是一个早期的工作。


lib.rs:

卡坦是一个用于编写服务器响应的库。

  • 你可以在测试中启动一个 Server
  • 创建将对其运行的请求。
  • 检索它们返回的内容。
  • 断言响应如你所期望的那样工作。

它内置了对 Serde、Cookies 和其他常用 crate 的支持,用于处理 Web。

入门指南

本质上;创建你的 Axum 应用程序,创建一个 Server,然后对其发出请求。

use ::axum::Router;
use ::axum::extract::Json;
use ::axum::routing::put;
use ::axum_test::Server;
use ::serde_json::json;
use ::serde_json::Value;

async fn put_user(Json(user): Json<Value>) -> () {
    // todo
}

let my_app = Router::new()
    .route("/users", put(put_user))
    .into_make_service();

let server = Server::new(my_app)
    .unwrap();

let response = server.put("/users")
    .json(&json!({
        "username": "Terrance Pencilworth",
    }))
    .await;

功能

当你启动一个 Server 时,你可以开启一个功能来自动保存请求之间的 cookie。这用于自动保存像会话 cookie 这样的东西。

use ::axum::Router;
use ::axum_test::Server;
use ::axum_test::ServerConfig;

let my_app = Router::new()
    .into_make_service();

let config = ServerConfig {
    save_cookies: true,
    ..ServerConfig::default()
};
let server = Server::new_with_config(my_app, config)
    .unwrap();

然后当你发出一个请求时,任何返回的 cookie 都将被用于下一个请求。这是基于服务器的(它不会跨服务器保存)。

你可以通过使用 `Request::do_save_cookies' 和 `Request::do_not_save_cookies' 来在每个请求上打开或关闭此功能。

内容类型 📇

在进行请求时,它将没有任何内容类型。

你可以通过在 ServerConfig 中设置 default_content_type 来设置所有 Request 对象使用的默认类型。在创建 Server 实例时使用 new_with_config

use ::axum::Router;
use ::axum_test::Server;
use ::axum_test::ServerConfig;

let my_app = Router::new()
    .into_make_service();

let config = ServerConfig {
    default_content_type: Some("application/json".to_string()),
    ..ServerConfig::default()
};

let server = Server::new_with_config(my_app, config)
    .unwrap();

如果没有默认设置,则一个 Request 会尝试猜测内容类型。例如,在调用 Request::json 时设置 application/json,在调用 Request::text 时设置为 text/plain。这将不会覆盖任何提供的默认内容类型。

最后,在每次 Request 中,可以通过调用它上的 Request::content_type 来设置要使用的内容类型。

use ::axum::Router;
use ::axum::extract::Json;
use ::axum::routing::put;
use ::kantan::Server;
use ::serde_json::json;
use ::serde_json::Value;

async fn put_user(Json(user): Json<Value>) -> () {
    // todo
}

let my_app = Router::new()
    .route("/users", put(put_user))
    .into_make_service();

let server = Server::new(my_app)
    .unwrap();

let response = server.put("/users")
    .content_type(&"application/json")
    .json(&json!({
        "username": "Terrance Pencilworth",
    }))
    .await;

快速失败

这个库被编写成快速崩溃。例如,默认情况下,一个响应将假设成功,并在它们不成功时崩溃(你可以更改它)。默认情况下,获取cookie和头部的函数如果找不到将崩溃。

这种行为对于Rust来说是不常见的,然而它是故意的,以便于编写测试。当你想要测试尽快失败,并跳过编写错误处理代码时。

依赖项

~6–18MB
~190K SLoC