我即将创建 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,它也有同样的错误
找到了我需要使用 http1_title_case_headers() 构建客户端的解决方案,因为 reqwest 默认设置小写