如何在 Rust 中将无效 JSON 请求正文中的错误描述返回给客户端?

azz*_*msa 1 rust actix-web

在 Python 中,我可以使用marshmallowPydantic来验证用户输入,只需定义一个模式(很像 Rust 结构)。然后使用该模式,Marshmallow 加载用户输入并返回它发现的错误。如:

图片

图片

我可以通过在 actix-web 中实现自定义错误句柄ResponseError

但是,如何将错误请求正文中的描述(无效值的位置/字段)返回给客户端?

图片

azz*_*msa 7

我一直在寻找答案。

不幸的是,包括 actix 在内的一些 Web 框架在我们进行任何验证之前会处理 JSON 错误。我一直在寻找使用各种关键字。其中之一是“actix-web 验证 JSON”,它让我找到了许多验证器箱。但我从这个博客中得到了见解:

提取器是实现 FromRequest 特性的助手。换句话说,他们根据请求构造任何对象并在此过程中执行验证。Actix web 附带了一些有用的提取器,例如 JSON,它使用 serde_json 反序列化 JSON 请求正文

因此,我搜索“actix Extractor”并为我带来Extractor Doc提取器错误的自定义处理

所以这个片段取自这个样板解决了我当前的问题。

   App::new()
       .configure(health::init)
       .configure(students::init)
+      .app_data(web::JsonConfig::default().error_handler(|err, _req| {
+          error::InternalError::from_response(
+              "",
+              HttpResponse::BadRequest()
+                  .content_type("application/json")
+                  .body(format!(r#"{{"error":"{}"}}"#, err)),
+          )
+          .into()
+      }))

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在此处输入图片说明