如何 return 无效 JSON 请求正文中的错误描述给 Rust 中的客户端?
How to return the error description in a invalid JSON request body to the client in Rust?
在 Python 中,我可以使用 marshmallow or Pydantic 通过定义模式(很像 Rust 结构)来验证用户输入。然后使用该架构,Marshmallow 加载用户输入并 returns 它发现的错误。
我可以通过实现 ResponseError
.
在 actix-web 中自定义错误句柄
但是,我如何return向客户端发送错误请求正文中的描述(position/field无效值)?
我一直在寻找答案。
不幸的是,在我们进行任何验证之前,包括 actix 在内的某些 Web 框架会处理 JSON 错误。我一直在寻找使用各种关键字。其中之一是“actix-web validate JSON”,这让我找到了许多验证器箱。但我从这个 blog 中得到了见解:
Extractors are helpers that implement the FromRequest trait. In other words, they construct any object from a request and perform validation along the way. A handful of useful extractors are shipped with Actix web, such as JSON which uses serde_json to deserialize a JSON request body
所以,我搜索“actix Extractor”并带给我 Extractor Doc and custom handling of extractor errors
所以这段摘自 this boilerplate 解决了我当前的问题。
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()
+ }))
在 Python 中,我可以使用 marshmallow or Pydantic 通过定义模式(很像 Rust 结构)来验证用户输入。然后使用该架构,Marshmallow 加载用户输入并 returns 它发现的错误。
我可以通过实现 ResponseError
.
但是,我如何return向客户端发送错误请求正文中的描述(position/field无效值)?
我一直在寻找答案。
不幸的是,在我们进行任何验证之前,包括 actix 在内的某些 Web 框架会处理 JSON 错误。我一直在寻找使用各种关键字。其中之一是“actix-web validate JSON”,这让我找到了许多验证器箱。但我从这个 blog 中得到了见解:
Extractors are helpers that implement the FromRequest trait. In other words, they construct any object from a request and perform validation along the way. A handful of useful extractors are shipped with Actix web, such as JSON which uses serde_json to deserialize a JSON request body
所以,我搜索“actix Extractor”并带给我 Extractor Doc and custom handling of extractor errors
所以这段摘自 this boilerplate 解决了我当前的问题。
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()
+ }))