为什么在通过 TLS 使用 hyper 0.14 发出 POST 请求时会出现类型不匹配?

阿比拉什·戈帕拉克里希纳

我正在尝试使用 hyper 构建一个 POST http 请求。我正在使用tokio_rustlstls 构建一个 https 连接器。

我正在使用的代码是:

use hyper::{body::to_bytes, client, Body, Method, Uri,Request};

let mut http = client::HttpConnector::new();
http.enforce_http(false);
//set tls configs.
let mut tls = tokio_rustls::rustls::ClientConfig::new();
// initialize http connector
let https = hyper_rustls::HttpsConnector::from((http, tls));
//prepare client with tls settings.
let client: client::Client<_, hyper::Body> = client::Client::builder().build(https);

let fut = async move {
        let req = Request::builder().method(Method::POST)
            .uri("url")
            .body(())
            .unwrap();
        let res = match client.request(req).await {
            Ok(d) => d,
            Method => {
                println!("Invalid method");
                std::process::exit(1);
            }
            TooLarge => {
                println!("Too large");
                std::process::exit(1);
            }
            Err(e) => {
                println!("unable to post {:?} ", e);
                std::process::exit(1);
            }
        };
        println!("Status:\n{}", res.status());
        println!("Headers:\n{:#?}", res.headers());

        let body: Body = res.into_body();
        let body = to_bytes(body)
            .await
            .map_err(|e| error(format!("Could not get body: {:?}", e)))?;
        println!("Body:\n{}", String::from_utf8_lossy(&body));
        // ...
}

我收到以下错误:

error[E0308]: mismatched types
   --> examples/client.rs:116:40
    |
116 |         let res = match client.request(req).await {
    |                                        ^^^ expected struct `Body`, found `()`
    |
    = note: expected struct `hyper::Request<Body>`
               found struct `hyper::Request<()>`

不知道我在这里做错了什么。

E_net4

类型不匹配完全按照声明的请求类型发生。再看一下 的定义client

let client: client::Client<_, hyper::Body> = client::Client::builder().build(https);

Client(称为B的第二个类型参数代表此客户端发出的所有请求的预期正文类型。在对 的所有后续调用中request,主体类型必须匹配。在这种情况下,它被定义为hyper::Body,这也是 的默认类型B但是,接下来发出的请求的主体值为 type ()

let req = Request::builder().method(Method::POST)
    .uri("url")
    .body(()) // <--- `()` instead of `Body`
    .unwrap();

如果将来不打算在所有请求中提供一个空主体,那么相应地更改类型参数B或让编译器自动推断它是安全的

let client: client::Client<_, _> = client::Client::builder().build(https);

否则,另一种方法是通过函数提供一个空体Body::empty

let req = Request::builder().method(Method::POST)
    .uri("url")
    .body(hyper::Body::empty()) // it's a match now
    .unwrap();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在片段 Kotlin 上使用“this”时会出现类型不匹配

使用获取发出POST请求

使用Bash发出POST请求

为什么发出POST请求后会收到OPTIONS请求?

为什么POSTMAN发出的POST请求返回空?

使用pastebin API发出简单的POST请求

如何使用 HttpServer 发出 POST 请求?

无法使用 axios 发出 POST 请求

使用Express发出POST请求时出错

使用 json 数据发出 POST 请求

Android 通过改造发出 POST 请求

为什么在直接传递函数时会出现“类型不匹配”错误,但它可以与等效的闭包一起使用?

如何通过axios在Reactjs中使用多个参数发出post请求

如何使用Scribe通过POST向自定义API发出OAuth2授权请求

当使用TryFuture而不是等效的Future时,为什么会出现关于类型不匹配的错误?

使用 Python 请求向本地主机发出 POST 请求

从openresty lua发出https tls请求

使用带有JSON负载的puppeteer发出POST请求

使用Javascript发出HTTP POST身份验证基本请求

Power Query,使用表单数据发出http POST请求

无法使用curl_setopt发出JSON数据的POST请求

如何使用改造2发出POST请求?

Python-使用Python 3 urllib发出POST请求

RxJS v5:如何使用参数发出POST请求?

如何使用Java Apache HttpClient正确发出POST请求?

如何使用 Node.JS 向 Ghostbin 发出 POST 请求?

无法使用Express API发出POST或GET请求

使用`http.NewRequest(...)`发出URL编码的POST请求

如何使用Advanced Rest Client发出POST请求