0

我正在尝试Stringwarp::server().run()函数作为监听地址。但我不知道如何实现Into<SocketAddr>字符串。

代码

use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .map(|name| format!("Hello, {}!", name));

    warp::serve(hello)
        .run("127.0.0.1:3030")
        .await;
}

错误

error[E0277]: the trait bound `std::net::SocketAddr: From<&str>` is not satisfied
  --> src/server/mod.rs:24:29
   |
24 |         warp::serve(routes).run("127.0.0.1:3030").await;
   |                             ^^^ the trait `From<&str>` is not implemented for `std::net::SocketAddr`
   |
   = help: the following implementations were found:
             <std::net::SocketAddr as From<(I, u16)>>
             <std::net::SocketAddr as From<SocketAddrV4>>
             <std::net::SocketAddr as From<SocketAddrV6>>
   = note: required because of the requirements on the impl of `Into<std::net::SocketAddr>` for `&str`
4

1 回答 1

2

从 a&strString到 a的转换SocketAddr是错误的,例如""不能映射到有效的SocketAddr

因此,您需要使用易错转换来获得实现的类型Into<SocketAddr>,其中一种类型就是SocketAddr它本身。您可以将 a 转换&str为 a SocketAddrthroughFromStrTryFrom使您能够编写"127.0.0.1:3030".parse::<SocketAddr>().unwrap().

另一种选择是更改将地址数据传递给run()方法的方式,例如([u8;4], u16)应该实现直接转换,因为类型将其限制为有效SocketAddrs。

于 2021-12-10T09:29:30.153 回答