Rust reqwest 出现 411 错误,但相同的格式适用于其他语言(python、httpie)

问题描述 投票:0回答:1

我即将创建 http 客户端来查询服务器上的一些数据,这些数据是我在 python 上完成的,或者使用 Httpie 进行测试,它可以工作并且服务器按预期响应,但是当我使用 Rust reqwest 时总是收到 411 错误(我尝试过其他板条箱)像 ureq、hyper、awc 也有同样的问题)。

这可能是一个非常简单的请求脚本,但我不知道为什么只有 Rust 会返回 411 错误

这个Python代码

import requests

url = "http://127.0.0.1:3000/GetPut"
querystring = {"TYPE":"GET"}
payload = ":HEADER\nTABLE=VERSION\nVERSION\nSTRING\n1.00\nTABLE=CURRENT_ATTRIBUTES\nSERIAL_NUM\nSTRING\nAB22D002000CD3C28\n"
headers = {
    "User-Agent": "request",
    "Host": "127.0.0.1",
    "Content-Type": "text/plain; charset=utf-8"
}
response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
print(response.text)

这里是 Rust 和 reqwest

let serial_num = "AB22D002000CD3C28";
let body = format!(":HEADER\nTABLE=VERSION\nVERSION\nSTRING\n1.00\nTABLE=CURRENT_ATTRIBUTES\nSERIAL_NUM\nSTRING\n{}\n",serial_num);

let body_length = body.chars().count().to_string();
let length = body_length.as_str();

let mut headers = HeaderMap::new();
headers.insert(CONTENT_LENGTH, HeaderValue::from_str(length).unwrap());
headers.insert(CONTENT_TYPE, HeaderValue::from_static("text/plain; charset=utf-8"));
headers.insert(HOST, HeaderValue::from_static("127.0.0.1"));
headers.insert(USER_AGENT, HeaderValue::from_static("reqwest"));

let url = "http://127.0.0.1:3000/GetPut";
let query = [("TYPE", "GET")];

let client = reqwest::Client::new();
let (cli, req) = client
        .post(url)
        .headers(headers)
        .query(&query)
        .body(body)
        .build_split();

let req = req.unwrap();
println!("{:?}",cli);
println!("{:?}",req);

let response = cli.execute(req).await.unwrap();

println!("{:?}", response.headers());
println!("{:?}", response.status());
println!("{}", response.text().await.unwrap());

我尝试使用Python、Httpie进行检查,格式和服务器响应与正常情况相同,只有Rust总是出现411错误,我也尝试了ureq,hyper,awc,它也有同样的错误

rust reqwest
1个回答
0
投票

找到了我需要使用 http1_title_case_headers() 构建客户端的解决方案,因为 reqwest 默认设置小写

© www.soinside.com 2019 - 2024. All rights reserved.