宏组合
2026/5/29大约 2 分钟hyperlanewebrustusage-introductionhook-composition
提示
hyperlane 框架提供了 prologue_macros / epilogue_macros 和 prologue_hooks / epilogue_hooks 属性宏, 允许将多个属性宏组合在一起,以简化代码编写。
prologue_macros
提示
prologue_macros 在函数体之前注入代码,宏列表中的顺序为头部插入顺序(第一个宏是最外层)。
use hyperlane::*;
use hyperlane_macros::*;
#[route("/prologue_macros")]
struct PrologueMacrosRoute;
impl ServerHook for PrologueMacrosRoute {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[prologue_macros(is_post_method, response_body("prologue_macros"), send)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}epilogue_macros
提示
epilogue_macros 在函数体之后注入代码,宏列表中的顺序为尾部插入顺序(最后一个宏是最外层)。
use hyperlane::*;
use hyperlane_macros::*;
#[response_middleware(1)]
struct ResponseMiddleware;
impl ServerHook for ResponseMiddleware {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[epilogue_macros(try_send, flush)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}prologue_hooks
提示
prologue_hooks 与 prologue_macros 功能相同,在函数体之前注入代码。
#[prologue_hooks(is_get_method, response_body("hello"), send)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}epilogue_hooks
提示
epilogue_hooks 与 epilogue_macros 功能相同,在函数体之后注入代码。
#[epilogue_hooks(try_send, try_flush)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}常用组合示例
请求方法过滤 + 响应 + 发送
use hyperlane::*;
use hyperlane_macros::*;
#[route("/combined")]
struct CombinedRoute;
impl ServerHook for CombinedRoute {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[prologue_macros(is_post_method, response_body("combined"), send)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}请求参数提取 + 响应 + 发送
use hyperlane::*;
use hyperlane_macros::*;
#[route("/query_combined/{id}")]
struct QueryCombinedRoute;
impl ServerHook for QueryCombinedRoute {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[prologue_macros(
try_get_route_param("id" => id),
response_body(&format!("id: {id:?}")),
send
)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}请求体提取 + 响应 + 发送
use hyperlane::*;
use hyperlane_macros::*;
#[route("/body_combined")]
struct BodyCombinedRoute;
impl ServerHook for BodyCombinedRoute {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[prologue_macros(
request_body(body),
response_body(&format!("body: {body:?}")),
send
)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}中间件中的组合
use hyperlane::*;
use hyperlane_macros::*;
#[request_middleware(1)]
struct RequestMiddleware;
impl ServerHook for RequestMiddleware {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
#[epilogue_macros(
response_status_code(200),
response_version(HttpVersion::Http1_1),
response_header(SERVER => HYPERLANE)
)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}