2 个不稳定版本

0.2.0 2023年5月5日
0.1.0 2022年8月15日

#10 in #http-error

MIT/Apache

11KB
71

actix-web-error

actix-web 制作错误响应变得简单。这个包将提供一个类似 thiserror 的 API 来指定 HTTP 状态,从而简化实现 actix_web::ResponseError 的错误。最好与 thiserror 结合使用。

目前,仅支持 JSON 响应。

感谢上述 thiserror 项目,我使用了其核心结构和核心工具。

错误响应

  • Json 将以 JSON 形式响应,格式为 { "error": <Display representation> } (application/json)。
  • Text 将响应错误 Display 的表示形式 (text/plain)。

示例

#[derive(Debug, thiserror::Error, actix_web_error::Json)]
#[status(BAD_REQUEST)] // default status for all variants
enum MyError {
    #[error("Missing: {0}")]
    MissingField(&'static str),
    #[error("Malformed Date")]
    MalformedDate,
    #[error("Internal Server Error")]
    #[status(500)] // specific override
    Internal,
}

#[derive(Debug, thiserror::Error, actix_web_error::Text)]
#[error("Item not found")]
#[status(404)]
struct MyOtherError;

这将大致扩展为

use actix_web::{ResponseError, HttpResponse, HttpResponseBuilder, http::StatusCode};

#[derive(Debug, thiserror::Error)]
enum MyError {
    #[error("Missing: {0}")]
    MissingField(&'static str),
    #[error("Malformed Date")]
    MalformedDate,
    #[error("Internal Server Error")]
    Internal,
}

#[derive(Debug, thiserror::Error)]
#[error("Item not found")]
struct MyOtherError;

impl ResponseError for MyError {
    fn status_code(&self) -> StatusCode {
        match self {
            Self::Internal => StatusCode::from_u16(500).unwrap(),
            _ => StatusCode::BAD_REQUEST,
        }
    }

    fn error_response(&self) -> HttpResponse {
        HttpResponseBuilder::new(self.status_code())
            .json(serde_json::json!({ "error": self.to_string() }))
    }
}

impl ResponseError for MyOtherError {
    fn status_code(&self) -> StatusCode {
        // With at least opt-level=1, this unwrap will be removed,
        // so this function will essentially return a constant.
        StatusCode::from_u16(404).unwrap()
    }
}

依赖项

~0.9–1.5MB
~31K SLoC