允许`手持者 ' 不返回`反应 '
动机
曾经有人要求将用户出错转换成在访问状态(#3211)的中间软件中的反应,或传播出错而不首先将其转换为反应(#2587).
另一个请求是要确保每个路线都使用授权提取器(# 3221). 这可以通过让所有处理者返回“授权的响应”来解决,它只能用一个授权提取器创建。
这样做应当允许的其他事情是,将简化序列 ' 的物体退回,并改用基于接受-编码 ' 的答复 ' 。
我有时也想在将回取值转换为HTTP响应之前,能够将回取值转换出.
当前状态
目前,每个 " Handler " 必须返回 " 简单反应 " ,反应立即自动转换为 " 反应 " ,然后可由中间软件采取行动。
这种架构使人们只能在HTTP响应中转换已经序列化的文本或二进制数据. 这对增加HTTP头或压缩等东西有好处,但对JSON有效载荷中增加一个共同场等其它变换则不那么有利.
同样地, " 方法路特 " 期望其每项服务返回 " 答复 " 和 " 帕特路特 " (和 " 路特内 " )期望其每一项内部服务(通常是 " 方法路特 " )也返回 " 答复 " 。
建议
我们可以允许“手持者”返回任何类型。 同样地,Method Router ' 、Path Router ' 和Router ' 可以允许从请求 ' 产生任何类型。 最后,我们想对最终归还的任何物品提出Into-response',但这种情况可能与Serve'一样晚,后者要求Router'的响应类型执行IntoResponse'。
而不是像这样产生 " Handler " 执行:
(美元)* 处理器 < (M, 美元 (ty, * $last, s) 为 F >
地点
F: FnOnce (美元(ty) * $last,) - > fut + Clone + 发送 +" static,
Fut: 未来 <输出=Res > + 发送,
S: 发送 + Sync +' static,
答复:答复,
$( $ty: 从请求部分 < S > + 发送, ) *
$last: 从请求<S, M> + 发送,
{
类型未来 = Pin <Box <dyn Future <Output > =响应 > + send *;
//.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?我们可以生成:
[Rust]
/ 将新的通用类型添加到“手提箱”中,表示返回类型的“手提箱:呼叫”
(美元)* 处理器 < (M, $( $ty, * $last, )), S, 结果 < Res, 答复\ = F
地点
F: FnOnce (美元(ty) * $last,) - > Fut + Clone + 发送 + 同步 +" static,,
Fut: 未来 <输出=Res > + 发送,
S: 发送 + Sync +' static,
回复 : 'static, // 返回的值不需要执行响应' $( $ty: 从请求部分 < S > + 发送, ) * $last: 从请求<S, M> + 发送, { / 汉德勒:呼叫 ' 将返回一个决心在一切提取器运行的情况下“反应”的未来。
// 成功或 " 响应 " 由提取器拒绝生成。
类型 未来 = Pin <Box <dyn Future = 结果 <Res, response * + send *;
//. {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
值得注意的是
. . . . . . .内容来源: tokio-rs/axum