Rust 对RequestGuard中的错误使用自定义火箭响应程序
在使用rocket.rs的web服务器应用程序中,我使用的错误类型在整个API中实现了Rust 对RequestGuard中的错误使用自定义火箭响应程序,rust,rust-rocket,Rust,Rust Rocket,在使用rocket.rs的web服务器应用程序中,我使用的错误类型在整个API中实现了响应程序。此错误类型确保所有错误都统一呈现(作为RFC 7807 json) 但是,我找不到在RequestGuards中使用这些错误响应的方法。似乎from_request函数会产生一个结果,它使用一个完全不同的模型,返回output::Failure((Status,T)) 如何确保这些请求保护中的错误以相同的JSON格式呈现?它甚至可以定制吗 我尝试使用catcher,但这似乎无法检索任何错误信息。状态:
响应程序
。此错误类型确保所有错误都统一呈现(作为RFC 7807 json)
但是,我找不到在RequestGuards
中使用这些错误响应的方法。似乎from_request
函数会产生一个结果
,它使用一个完全不同的模型,返回output::Failure((Status,T))
如何确保这些请求保护中的错误以相同的JSON格式呈现?它甚至可以定制吗
我尝试使用catcher,但这似乎无法检索任何错误信息。状态:
请注意,用户可以请求类型的结果
和选项
,以捕获故障
并检索错误值
FromRequest
实现的开始,定义type Error=JsonValue代码>
from_request
函数中,确保它返回request::output
,其中S
是您实现的目的from_request
函数中,当您想要返回失败时,执行类似output::failure((Status::Unauthorized,json!({“error”:“Unauthorized”}))的操作
,或者执行您想要返回的任何操作Result
作为请求保护的类型,其中s
是您实现的目的。例如,在路线中,使用match
将其与Ok
或Err(json\u error)
匹配output::Failure
的状态,但我所描述的解决方案意味着,如果您使用的是自定义响应程序,您将在响应程序中设置状态,而不是基于output::Failure
——例如下面的代码
下面是一个应用于文档中的ApiKey
请求保护示例的示例,其中一个名为ApiResponse
的示例自定义响应程序设置了自己的状态:
#[宏使用]
外部板条箱火箭;
#[宏_使用]
外部板条箱火箭;
#[宏_使用]
外部板条箱serde_;
使用结果;
使用rocket::http:{ContentType,Status};
使用rocket::request::{self,request,FromRequest};
使用rocket::response::{self,Responder,response};
使用rocket_contrib::json::{json,JsonValue};
#[导出(调试)]
发布结构ApiResponse{
pub-json:JsonValue,
发布状态:状态,
}
API响应的impl{
fn respond_to(self,req:&Request)->response::Result状态:
请注意,用户可以请求类型的结果
和选项
,以捕获故障
并检索错误值
在您的FromRequest
实现开始时,定义type Error=JsonValue;
在from_request
函数中,确保它返回request::output
,其中S
是您实现的目的
在from_request
函数中,当您想要返回失败时,执行类似output::failure((Status::Unauthorized,json!({“error”:“Unauthorized”}))的操作
,或者执行您想要返回的任何操作
在路由的函数中,使用Result
作为请求保护的类型,其中s
是您在何处实现的。在路由中,使用match
将其与Ok(s)
或Err(json\u error)
匹配
可能有一种方法可以传递output::Failure
的状态,但我所描述的解决方案意味着,如果您使用的是自定义响应程序,您将在响应程序中设置状态,而不是基于output::Failure
——例如下面的代码
下面是一个应用于文档中的ApiKey
请求保护示例的示例,其中一个名为ApiResponse
的示例自定义响应程序设置了自己的状态:
#[宏使用]
外部板条箱火箭;
#[宏_使用]
外部板条箱火箭;
#[宏_使用]
外部板条箱serde_;
使用结果;
使用rocket::http:{ContentType,Status};
使用rocket::request::{self,request,FromRequest};
使用rocket::response::{self,Responder,response};
使用rocket_contrib::json::{json,JsonValue};
#[导出(调试)]
发布结构ApiResponse{
pub-json:JsonValue,
发布状态:状态,
}
API响应的impl{
fn response_to(self,req:&Request)->response::Result