和使用 http 类似,测试代码可以这样写:

use actix_web::client::Client;

#[actix_rt::main]
async fn main() {
    let mut client = Client::default();

    // Create request builder and send request
    let response = client.get("https://sunnysab.cn")
      .send().await.unwrap();

    println!("{:?}", response);

}

然后编译运行,会 panic。崩溃提示:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Connect(SslIsNotSupported)', src\main.rs:34:20
stack backtrace:
   0: backtrace::backtrace::trace_unsynchronized
             at C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.40\src\backtrace\mod.rs:66
   1: std::sys_common::backtrace::_print_fmt
             at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447\/src\libstd\sys_common\backtrace.rs:77
   2: std::sys_common::backtrace::_print::{{impl}}::fmt
             at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447\/src\libstd\sys_common\backtrace.rs:59
// 省略

actix-web 提供了两种 SSL 库的支持,OpenSSL 和 rustls。我在用 vcpkg install openssl 折腾了一个小时后,选择了 rustls。rustls 十分简单,据评测性能比前者更好。打开 Cargo.toml,插入:

actix-web = { version = "2.0", features = ["rustls"] }

就可以了。

  与个人证书、不安全连接相关的需求,可用参考这个单元测试的内容:

https://github.com/actix/actix-web/blob/master/awc/tests/test_rustls_client.rs

刚开始的时候没有找到相关的 Guide, 在 Google 的时候发现在 actix-web 仓库中有与 rustls 相关的一条 pull request 和一个 issue,不过没有给出可用的代码。参阅了 Github 上 AWC 相关的单元测试

// 代码片段
let client = awc::Client::build()
    .connector(awc::Connector::new().ssl(builder.build()).finish())
    .finish();

let request = client.get(srv.surl("/")).send();
let response = request.await.unwrap();
assert!(response.status().is_success());

便以这个思路改了半天,如把 ssl() 替换成 rustls(),费了不少功夫。