How to return the error description in a invalid JSON request body to the client in Rust?

2.9k views Asked by At

In Python, I can use marshmallow or Pydantic to validate user input just by defining a schema (much like a Rust struct). Then using that schema, Marshmallow loads the user input and returns the error it finds. Such as:

image

image

I can have custom error handle in actix-web by implementing ResponseError.

But, how can I return the description (position/field of invalid value) in a bad request body to the client?

image

1

There are 1 answers

4
azzamsa On BEST ANSWER

I am always looking for answers.

Unfortunately, some web frameworks including actix handle JSON error before we can do any validation. I keep searching for using various keywords. One of them is "actix-web validate JSON" which leads me to many validator crates. But I get insight from this blog saying that:

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

So, I search for "actix Extractor" and bring me Extractor Doc and custom handling of extractor errors

So this snippet is taken from this boilerplate solves my current problem.

   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()
+      }))

enter image description here

enter image description here