框架推荐工具
hyperlane-utils
提示
hyperlane
框架推荐使用 hyperlane-utils
库(需额外安装和导入), 使用参考 官方文档。
lombok
提示
hyperlane
框架推荐使用 lombok
库(需额外安装和导入), 使用参考 官方文档。
clonelicious
提示
hyperlane
框架推荐使用 clonelicious
库,内部提供变量捕获和克隆(需额外安装和导入), 使用参考 官方文档。
future-fn
提示
hyperlane
框架推荐使用 future-fn
库(需额外安装和导入), 使用参考 官方文档。
std-macro-extensions
提示
hyperlane
框架推荐使用 std-macro-extensions
库(需额外安装和导入), 使用参考 官方文档。
color-output
提示
hyperlane
框架推荐使用 color-output
库(需额外安装和导入), 使用参考 官方文档。
bin-encode-decode
提示
hyperlane
框架推荐使用 bin-encode-decode
库(需额外安装和导入), 使用参考 官方文档。
file-operation
提示
hyperlane
框架推荐使用 file-operation
库(需额外安装和导入), 使用参考 官方文档。
compare-version
提示
hyperlane
框架推荐使用 compare-version
库(需额外安装和导入), 使用参考 官方文档。
hyperlane-log
提示
hyperlane
框架使用 hyperlane-log
库(需额外安装和导入), 使用参考 官方文档。
hyperlane-time
提示
hyperlane
框架推荐使用 hyperlane-time
库(需额外安装和导入), 使用参考 官方文档。
recoverable-spawn
提示
hyperlane
框架推荐使用 recoverable-spawn
库(需额外安装和导入), 使用参考 官方文档。
recoverable-thread-pool
提示
hyperlane
框架推荐使用 recoverable-thread-pool
库(需额外安装和导入), 使用参考 官方文档。
http-request
提示
hyperlane
框架推荐使用 http-request
库,支持 http
和 https
(需额外安装和导入), 使用参考 官方文档。
hyperlane-broadcast
提示
hyperlane
框架推荐使用 hyperlane-broadcast
库(需额外安装和导入), 使用参考 官方文档。
hyperlane-plugin-websocket
提示
hyperlane
框架推荐使用 hyperlane-plugin-websocket
库(需额外安装和导入), 使用参考 官方文档。
urlencoding
提示
hyperlane
框架推荐使用 urlencoding
库(需额外安装和导入),可以实现 url
编解码。
server-manager
提示
hyperlane
框架推荐使用 server-manager
库(需额外安装和导入), 使用参考 官方文档。
chunkify
提示
hyperlane
框架推荐使用 chunkify
库(需额外安装和导入), 使用参考 官方文档。
china_identification_card
提示
hyperlane
框架推荐使用 china_identification_card
库(需额外安装和导入), 使用参考 官方文档。
utoipa
提示
hyperlane
框架推荐使用 utoipa
库实现 openapi
,下面是一段简单的示例代码
use hyperlane::*;
use serde::Serialize;
use serde_json;
use utoipa::{OpenApi, ToSchema};
use utoipa_rapidoc::RapiDoc;
use utoipa_swagger_ui::SwaggerUi;
#[derive(Serialize, ToSchema)]
struct User {
name: String,
age: usize,
}
#[derive(OpenApi)]
#[openapi(
components(schemas(User)),
info(title = "Hyperlane", version = "1.0.0"),
paths(index, user, openapi_json, swagger)
)]
struct ApiDoc;
async fn request_middleware(ctx: Context) {
ctx.set_response_status_code(200).await;
}
#[utoipa::path(
get,
path = "/openapi.json",
responses(
(status = 200, description = "Openapi docs", body = String)
)
)]
async fn openapi_json(ctx: Context) {
ctx.set_response_body(ApiDoc::openapi().to_json().unwrap())
.await
.send()
.await
.unwrap();
}
#[utoipa::path(
get,
path = "/{file}",
responses(
(status = 200, description = "Openapi json", body = String)
)
)]
async fn swagger(ctx: Context) {
SwaggerUi::new("/{file}").url("/openapi.json", ApiDoc::openapi());
let res: String = RapiDoc::with_openapi("/openapi.json", ApiDoc::openapi()).to_html();
ctx.set_response_header(CONTENT_TYPE, TEXT_HTML)
.await
.set_response_body(res)
.await
.send()
.await
.unwrap();
}
#[utoipa::path(
get,
path = "/",
responses(
(status = 302, description = "Redirect to index.html")
)
)]
async fn index(ctx: Context) {
ctx.set_response_header(LOCATION, "/index.html")
.await
.set_response_body(vec![])
.await
.send()
.await
.unwrap();
}
#[utoipa::path(
get,
path = "/user/{name}",
responses(
(status = 200, description = "User", body = User)
)
)]
async fn user(ctx: Context) {
let name: String = ctx.get_route_param("name").await.unwrap();
let user: User = User { name, age: 0 };
ctx.set_response_body(serde_json::to_vec(&user).unwrap())
.await
.send()
.await
.unwrap();
}
#[tokio::main]
async fn main() {
let server: Server = Server::new();
server.request_middleware(request_middleware).await;
server.route("/", index).await;
server.route("/user/{name}", user).await;
server.route("/openapi.json", openapi_json).await;
server.route("/{file}", swagger).await;
server.run().await.unwrap();
}