响应
2024/12/30大约 3 分钟hyperlanewebrustusage-introductionresponse
提示
hyperlane 框架没有发送响应前通过 ctx 中 get_response 获取的只是响应的初始化实例,里面其实没有数据, 只有当用户发送响应时才会构建出完整 http 响应,此后再次 get_response 才能获取到响应内容。
提示
hyperlane 框架对 ctx 额外封装了子字段的方法,可以直接调用大部分子字段的 get 和 set 方法名称, 例如:调用 response 上的 get_status_code 方法。
调用规律
- 原
response的get方法的get名称后加response名称,中间使用_拼接。 - 原
response的set方法的set名称后加response名称,中间使用_拼接。
获取响应
获取 response
let response: &Response = ctx.get_response();获取响应版本
let version: &ResponseVersion = ctx.get_response().get_version();获取响应状态码
let status_code: ResponseStatusCode = ctx.get_response().get_status_code();获取响应原因短语
let reason_phrase: &ResponseReasonPhrase = ctx.get_response().get_reason_phrase();获取完整响应头
let headers: &ResponseHeaders = ctx.get_response().get_headers();获取某个响应头
// 尝试获取响应头
let value: OptionResponseHeadersValue = ctx.get_response().try_get_header(CONTENT_TYPE);
// 获取响应头(获取不到则panic)
let value: ResponseHeadersValue = ctx.get_response().get_header(CONTENT_TYPE);获取响应头的第一个值
// 尝试获取响应头的第一个值
let header_value: OptionResponseHeadersValueItem = ctx.get_response().try_get_header_front(CONTENT_TYPE);
// 获取响应头的第一个值(获取不到则panic)
let header_value: ResponseHeadersValueItem = ctx.get_response().get_header_front(CONTENT_TYPE);获取响应头的最后一个值
// 尝试获取响应头的最后一个值
let header_value: OptionResponseHeadersValueItem = ctx.get_response().try_get_header_back(CONTENT_TYPE);
// 获取响应头的最后一个值(获取不到则panic)
let header_value: ResponseHeadersValueItem = ctx.get_response().get_header_back(CONTENT_TYPE);检查是否存在特定响应头
let has_header: bool = ctx.get_response().get_has_header(CONTENT_TYPE);检查响应头是否包含特定值
let has_value: bool = ctx.get_response().get_header_value(CONTENT_TYPE, APPLICATION_JSON);获取响应头数量
let headers_count: usize = ctx.get_response().get_headers_length();获取响应头值的数量
// 尝试获取响应头值的数量
let header_count: OptionUsize = ctx.get_response().try_get_header_length(CONTENT_TYPE);
// 获取响应头值的数量(获取不到则panic)
let header_count: usize = ctx.get_response().get_header_length(CONTENT_TYPE);获取所有响应头值的总数量
let total_values: usize = ctx.get_response().get_headers_values_length();获取响应体
let body: &ResponseBody = ctx.get_response().get_body();获取 string 格式的响应体
let body: String = ctx.get_response().get_body_string();获取 json 格式的响应体
// 反序列化响应体
let body: ResultJsonError<T> = ctx.get_response().try_get_body_json::<T>();
// 反序列化响应体(反序列化失败则panic)
let body: T = ctx.get_response().get_body_json::<T>();设置响应
设置 response
ctx.get_mut_response().set_response(Response::default());设置响应版本
注意
特别注意的是需要设置响应版本,框架默认的版本是空字符串,客户端处理会异常。
ctx.get_mut_response().set_version(HttpVersion::Http1_1);设置响应状态码
ctx.get_mut_response().set_status_code(200);设置响应原因短语
ctx.get_mut_response().set_reason_phrase("OK");设置响应体
ctx.get_mut_response().set_body("Hello World");设置(添加)响应头
提示
hyperlane 框架对响应头的 key 是不做大小写处理的,建议使用框架定义的常量。
ctx.get_mut_response().add_header(SERVER, "hyperlane");设置(替换)响应头
ctx.get_mut_response().set_header(CONTENT_TYPE, APPLICATION_JSON);移除响应头
ctx.get_mut_response().remove_header(CONTENT_TYPE);移除响应头的特定值
ctx.get_mut_response().remove_header_value(CONTENT_TYPE, APPLICATION_JSON);清空所有响应头
ctx.get_mut_response().clear_headers();属性宏写法
提示
hyperlane 框架提供了属性宏来简化响应信息的设置,可以在 handle 方法上使用属性宏自动设置响应信息。
设置响应状态码
use hyperlane::*;
use hyperlane_macros::*;
#[route("/response_status_code")]
struct ResponseStatusCodeRoute;
impl ServerHook for ResponseStatusCodeRoute {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[response_status_code(200)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}设置响应版本
#[response_version(HttpVersion::Http1_1)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}设置响应原因短语
#[response_reason_phrase("OK")]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}设置响应头
#[response_header(SERVER => HYPERLANE)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}设置响应体
#[response_body("Hello World")]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}清空所有响应头
#[clear_response_headers]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}转字符串
通过 to_string
提示
将获得完整的原始结构体字符串结构。
ctx.get_response().to_string();