来自 "reqwest" Rust crate 的 POST 请求时请求体为空

3

我正在尝试使用 Rust 的 reqwest 框架进行 POST 请求。这是 cargo.toml 文件的片段:

[dependencies]
tokio = { version = "0.2", features = ["full"] }
reqwest = { version = "0.10", features = ["json"] }

这里是我从中发出请求到简单服务器的代码片段。
use reqwest::{Response, StatusCode};
use serde_json::{json, Value};

#[tokio::main]
async fn main() ->  Result< (),  reqwest::Error>  {

    let map1 = json!({
        "abc":"abc",
        "efg":"efg"
    });

    let body: Value = reqwest::Client::new()
    .post("http://localhost:4000/hello")
    .json(&map1)
    .send()
    .await?
    .json()
    .await?;

    println!("Data is : {:?}", body);

    Ok(())
}

使用简单服务器crate编写的代码片段,我正在用它提供此请求:

use simple_server::{Server, StatusCode};

fn main() {
    let server = Server::new(|req, mut response| {

        println!(
            "Request received {} {} {:?}",
            req.method(),
            req.uri(),
            &req.body()
        );

        match (req.method().as_str(), req.uri().path()) {
            ("GET", "/") => Ok(response.body(format!("Get request").into_bytes())?),

            ("POST", "/hello") => Ok(response.body(format!("Post request").into_bytes())?),

            (_, _) => {
                response.status(StatusCode::NOT_FOUND);
                Ok(response.body(String::from("Not Found").into_bytes())?)
            }
        }
    });

    server.listen("127.0.0.1", "4000");
}

我得到的输出是:
Request received POST /hello []

期望的输出是字节向量数组,但我收到了一个空的字节向量数组。
我已经尝试过的解决方案有:
- 使用Postman向同一服务器进行POST请求,并且它可以正常工作。 - 使用相同的reqwest代码向任何其他服务器(例如hyper、actix等)进行POST请求,并且它可以正常工作。 - 将简单的内容发送为POST请求的正文(没有JSON)。但是仍然出现相同的问题。
因此,我认为问题必须与这个简单的服务器创建器有关。欢迎提出任何有价值的建议。

1
我尝试连续发起多个请求(使用wget --post-file=...),似乎随机显示数据或一个空结果。听起来像是simple-server中的一个错误。 - Jmb
@Jmb,你说得对。我也遇到了同样的问题,有时候它能正常工作,但很可能是一个bug。 - Jawwad Turabi
1个回答

0
use reqwest::{Response, StatusCode};
use serde_json::{json, Value};

#[tokio::main]
async fn main() ->  Result<String>  {

 let map1 = json!({
    "abc":"abc",
    "efg":"efg"
 });

 let body: Value = reqwest::Client::new()
 .post("http://localhost:4000/hello")
 .json(&map1)
 .send()
 .await?
 .json()
 .await?;

 println!("Data is : {:?}", body);
 let resp = serde_json::to_string(&body).unwrap();
    Ok(resp)

 }

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接