#hyper #http #web

hyper-method-override-middleware

一个基于 _method 查询参数覆盖 HTTP 方法的服务中间件,允许 Web 浏览器模拟非 GET/POST 请求

2 个版本 (1 个稳定版本)

1.0.0 2020 年 10 月 4 日
0.1.0 2020 年 10 月 4 日

#1389HTTP 服务器

Apache-2.0

9KB
110 代码行

Hyper 方法覆盖中间件

crates.io Documentation Apache-2 licensed

一个 Hyper 中间件,它使用请求中的 _method 查询参数指定的方法覆盖传入的 POST 请求。这对于 Web 浏览器通常只支持 GET 和 POST 请求,但我们的应用程序可能需要其他更符合语义的 HTTP 方法是有用的。

接受覆盖的方法有 PUT、PATCH 和 DELETE,其他方法将被忽略。

_method 查询参数可以像这样在 HTML 表单中指定

<form method="POST" action="/item/1?_method=DELETE">
    <button type="submit">Delete item</button>
</form>

然后可以将中间件应用到我们的 Hyper 服务中,如下所示

let service = MethodOverrideMiddleware::new(service);

完整示例

这是 Hyper 主页上的示例,其中已应用中间件。

use std::{convert::Infallible, net::SocketAddr};
use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};

async fn handle(_: Request<Body>) -> Result<Response<Body>, Infallible> {
    Ok(Response::new("Hello, World!".into()))
}

#[tokio::main]
async fn main() {
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

    let make_svc = make_service_fn(|_conn| async {
        let service = MethodOverrideMiddleware::new(service_fn(handle));
        Ok::<_, Infallible>(service)
    });

    let server = Server::bind(&addr).serve(make_svc);

    if let Err(e) = server.await {
        eprintln!("server error: {}", e);
    }
}

依赖关系

~11MB
~204K SLoC