Rust in Everything
基于 axum 0.8.9

响应

请求主线的最后一步:你的函数返回一个值,Handler::call 对它调 into_response(),得到一个 Response<Body> 交回路由层。提取失败时的 rejection 也走同一条路。axum 不规定返回类型,只要求实现 IntoResponse,这一部分讲这个 trait 能做到什么、做不到什么。

  1. IntoResponse 与 IntoResponseParts:现成实现大多是「造 body + 加 Content-Type」;元组先生成最后的 body,再从左到右套用中间的部件,最后设状态码,所以 StatusCode 只能放最前或最后;数组和 HeaderMap 替换同名头,AppendHeaders 追加;自定义错误类型实现 IntoResponse 是惯用法,(StatusCode, Json) 会盖掉序列化失败的 500。
  2. SSE 与重定向:Sse 把 Event 流逐个变成 body 帧,Event 按调用顺序写 name: value 行,data 拆换行、其他字段遇换行 panic;KeepAlive 在空闲满间隔(默认 15 秒)时发 :\n\n;Redirect 只有 303、307、308。
flowchart TB
  ret["handler 返回值"] --> ir["IntoResponse"]
  rej["rejection"] --> ir
  ir --> plain["字符串、字节、Json、Html"]
  ir --> tup["元组:部件 + body"]
  ir --> sse["Sse:流式 body"]
  ir --> redir["Redirect:状态码 + Location"]
  plain --> resp["Response Body"]
  tup --> resp
  sse --> resp
  redir --> resp

💬 关联讨论

发起讨论
加载中...