#actix-web #后端 #插件 # #枚举

actix-web-utils

为actix web提供一些有用的插件

31个版本

0.2.20 2022年9月20日
0.2.19 2022年9月20日
0.2.13 2022年8月31日
0.1.9 2022年8月29日

HTTP服务器类别中排名398

Download history 5/week @ 2024-03-29 2/week @ 2024-04-05

每月下载量102

MIT协议

21KB
252

Actix-web-utils

作者:franklin blanco

为典型的Web应用添加一些有用的结构体、枚举、宏等,目前仅与actix-web后端兼容。

为什么使用这个包?

说实话,我发现自己在开发Web应用的后端应用程序时,重复使用相同的结构体、行为和逻辑。

这个包只是让所有东西都变得统一且易于阅读。

如何实现?

主要是通过标准化一切可以标准化的东西,尽可能重复逻辑和代码,以保持一致且直接的开发。

大多数Web应用后端都有控制器(定义路由的地方)、服务(包含业务逻辑的地方(也可以在控制器内))、仓库/dao(数据库访问逻辑和方法)、客户端/通信者(API消费)。我们从控制器开始。

控制器

通常有一个定义好的路由和期望的返回类型以及错误类型。

use actix_web::{http::header::ContentType, HttpResponse};

async fn index() -> HttpResponse {
    HttpResponse::Ok()
        .content_type(ContentType::plaintext())
        // .insert_header(("X-Hdr", "sample")) <-- This line is irrelevant for this example
        .body("data")
}

直接来自actix.rs

我觉得actix介绍这个的方式有点枯燥。那怎么样

use actix_web::{http::header::ContentType, HttpResponse};
use actix_web_utils::extensions::{TypedHttpResponse};

async fn index() -> TypedHttpResponse<String> {
    TypedHttpResponse::return_standard_response(200, "data".to_string())
}

更易于阅读,并且它将你提供的一切都包装在一个Json响应中,这是通常的标准。你可以直接看到状态码,如果成功,响应必须是一个String(这很重要)。

当然,你失去了actix web给你提供的很多模块化。这就是为什么它不是HttpResponse的替代品,而是一个另一种类型。你总是可以回过头去使用HttpResponse,我的库不是用来替换它的,而是为了减少它带来的重复。

预期限制

  • 只能使用实现serde::Serialize的东西,因为它尝试将所有东西都包裹在json中。这是计划中的。
  • 失去了模块化,没有响应头,大多数HttpResponse的功能都丢失了。这也是计划中的。
  • 没有自定义错误。使用这个意味着你将使用这个包中定义的错误类型和MessageResource。很抱歉,为每个人编写一个模块化的解决方案会很困难。欢迎贡献,真的。我会尽快回复。如果你不想贡献,也可以自由地进行分支。

服务

这里存放着您的业务逻辑。这确实是所有内容中最具变化的,因为每个人都有自己的做事方式。但我见过很多代码,它们只是这样

fn service_layer_function() -> HttpResponse {
	// ... Some Business logic
	let value_returned_from_match = match function_that_returns_a_result() {
		Ok(value) => value,
		Err(error) => return 
		HttpResponse::BadRequest().json(web::Json(error.to_string()))
	};
	// ... More Business logic
}

您本可以这样做

fn service_layer_function() -> TypedHttpResponse<T> { //T can be whatever you want
	// ... Some Business logic
	let value_returned_from_match = unwrap_or_return_handled_error!(
		function_that_returns_a_result(), T
	);
	// ... More Business logic
}

对我来说,这更好,也更易于阅读。

仓库(数据库访问对象)

未完成!

MessageResource

这是一个关键的错误消息类型,可以返回整洁、格式化的错误消息给前端。键是可选的,因为我不强制您使用国际化。

{
	"key": "ERROR_KEY",
	"message": "This is the part where you put the error message."
}

这应该发送回客户端,以便客户端可以向用户显示错误,并且/或者获取翻译(带有键)。这是可选的。

TypedHttpResponse

HttpResponse的包装器。包含一个类型规范,以便您可以可视化并期望某种类型。

这种类型只能是Serializable(Json)。

它还可以返回MessageResource或什么也不返回。

依赖项

~14–25MB
~452K SLoC