2

我想编写一个返回的函数impl Reply,即 Warp 处理程序。此函数执行一些业务逻辑,然后应返回两个Set-Cookie标头;每个 cookie 的内容是不同的,并且取决于业务逻辑。我一直在使用这样的模式:

async fn my_handler() -> anyhow::Result<impl Reply> {
    // Some business logic...

    let reply = warp::reply::json(&json!({}));
    let reply = warp::reply::with_status(reply, StatusCode::OK);
    let reply = warp::reply::with_header(
        reply,
        header::SET_COOKIE,
        "foo=bar",
    );

    Ok(warp::reply::with_header(
        reply,
        header::SET_COOKIE,
        "baz=qux",
    ))
}

但是,这将导致仅设置第二个 cookie。另外还有warp::filters::reply::headers,最初似乎是我想要的,但目前尚不清楚这如何与reply上面的配合得很好。

4

2 回答 2

2

我可以通过将其转换reply为 aResponse然后手动操作响应来解决此问题。这类似于 cperez08 的答案,但允许将两个同名的标头附加到响应中:

async fn my_handler() -> anyhow::Result<impl Reply> {
    // Some business logic...

    let reply = warp::reply::json(&json!({}));
    let reply = warp::reply::with_status(reply, StatusCode::OK);

    // Set multiple e.g. cookies.
    let mut cookies = HeaderMap::new();
    cookies.append(header::SET_COOKIE, HeaderValue::from_str("foo").unwrap());
    cookies.append(header::SET_COOKIE, HeaderValue::from_str("bar").unwrap());

    // Convert `reply` into a `Response` so we can extend headers.
    let mut response = reply.into_response();
    let headers = response.headers_mut();
    headers.extend(cookies);

    Ok(response)
}
于 2020-07-22T13:41:21.620 回答
1

如果您想更轻松地添加多个标头,可以使用响应构建器附加多个标头。

let builder = warp::http::response::Builder::new();

return builder
.header("content-type", "application/json")
.header("my-header-1", "my-val-1")
.header("my-header-2", "my-val-2")
.status(200)
.body(json!(&struct_rs).to_string())
.unwrap()

builder.unwrap 已经实现了 warp::Reply。

但是,您面临的情况有所不同,因为标头具有相同的名称,这就是被覆盖的原因,您需要在设置 cookie 标头之前附加这些值。

于 2020-07-22T07:27:06.250 回答