rust 如何返回自定义的标题而不返回正文?

yr9zkbsy  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(144)

我想做的是返回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> {
    let body = "Hello, world!";

     let response = Response::builder()
        .header("Content-Type", "text/html")
        .header("Location, www.example.com")
        .header("content-length", body.len())
        .body(body.into())
        .unwrap();
}

# [tokio::main]

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

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

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

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

正如您所看到的,我返回了Location头,所以我希望用户被重定向到www.example.com,但这并没有发生。我猜这是因为它返回了一个html主体,它以文本Hello, world!的形式返回,而该主体阻止了重定向。但是,该函数希望得到一个响应html主体,那么我该怎么做呢?我该如何返回没有函数体的头呢?还是我有什么误解?

dw1jzc5e

dw1jzc5e1#

要使响应执行重定向,请将状态代码设置为3xx代码中的一个。主体不应导致问题,但要返回没有主体的响应,请使用Body::empty()。使用hyper中的常量作为常见的状态代码和头文件名称也是一个好主意。

let response = Response::builder()
        .status(hyper::StatusCode::FOUND)
        .header(hyper::header::LOCATION, "https://www.example.com")
        .body(Body::empty())
        .unwrap();

相关问题