如何在 Actix-web 4.0 中使用 actix_web::client::Client

How to use actix_web::client::Client in Actix-web 4.0

我使用的是使用 tokio 1 的 crate scylla,所以我必须使用 crate actix-web 4.0 beta。 现在我有问题,使用 actix_web::client::Client 显示错误:

3 | use actix_web::client::Client;
  |                ^^^^^^ could not find `client` in `actix_web`

我想使用此代码在 actix 处理程序中点击 API:

pub(crate) async fn proses_mapmatching(data: web::Data<AppState>) -> impl Responder {

    let client = Client::default();

    let res = client.post("http://localhost:8002/trace_route")
        .send()
        .await
        .unwrap()
        .body()
        .await;

    println!("Response: {:?}", res);

    HttpResponse::Ok().body(format!("Hello {:?}", res))
}

是否仍然使用带有请求 post insede 处理函数的 actix-web 4? 谢谢

带有 AWC 的答案代码 - 感谢 @kmdreko 先生

pub(crate) async fn proses_mapmatching(data: web::Data<AppState>) -> impl Responder {

    let mut client = awc::Client::default();
    let response = client.post("http://localhost:8002/trace_route")
        .send_body("Raw body contents")
        .await;

    println!("Response: {:?}", response.unwrap().body().await);

    HttpResponse::Ok().body(format!("Hello {}!", rows.len()))
}

这在 actix_web Changes.md for v4.0 中提到:

The client mod was removed. Clients should now use awc directly.

自 1.0 版本以来,actix_web::client 模块在很大程度上一直是 awc 板条箱的包装器,但现在他们似乎想将它们完全分开。

awc 中的类型应该与之前 actix_web 版本中公开的类型几乎相同,但是如果您将它与 actix_web:4.0(目前处于测试阶段)一起使用,那么您我想使用 awc:3.0(目前处于测试阶段)以实现兼容性。

这是我用来 运行 AWC 示例

Cargo.toml

[dependencies]
openssl = "0.10.38"
actix-web = "4.0.0-beta.12"
awc = { version = "3.0.0-beta.11", features = [ "openssl" ] }

main.rs

use awc::Client;

#[actix_web::main]
async fn main() {
    let client = Client::new();

    let res = client
         .get("http://www.rust-lang.org")    // <- Create request builder
         .insert_header(("User-Agent", "Actix-web"))
         .send()                             // <- Send http request
         .await;

    println!("Response: {:?}", res);        // <- server http response
}

最佳!