Rust reqwest发起POST请求遇411错误,Python/Httpie可正常请求
问题原因
HTTP 411错误(Length Required)的核心原因是你手动设置的Content-Length值不符合服务器预期。你的Rust代码中用body.chars().count()计算请求体长度,这得到的是字符数量,但HTTP协议要求Content-Length必须是请求体的字节数。
虽然当前payload里都是单字节UTF-8字符,但这种计算逻辑本身存在错误——若后续出现多字节字符,或因平台差异导致换行符编码变化(比如Windows下\n会被处理为\r\n),都会造成字符数与字节数不匹配,触发服务器的长度校验错误。而Python的requests库会自动计算请求体的字节长度并填充Content-Length头,因此不会出现该问题。
解决方案
方案1:移除手动设置的Content-Length(推荐)
reqwest、hyper、ureq等Rust HTTP客户端库会自动处理Content-Length的计算与设置,完全不需要手动干预,手动设置反而容易引入错误。
方案2:手动计算正确的字节长度
如果必须手动设置Content-Length,要基于字符串的字节数计算,而非字符数:
// 正确计算字节长度 let body_length = body.as_bytes().len().to_string();
修正后的Rust代码
use reqwest::{Client, header::{CONTENT_TYPE, HOST, USER_AGENT, HeaderMap, HeaderValue}}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { 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 mut headers = HeaderMap::new(); 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 = Client::new(); let response = client .post(url) .headers(headers) .query(&query) .body(body) .send() .await?; println!("{:?}", response.headers()); println!("{:?}", response.status()); println!("{}", response.text().await?); Ok(()) }
内容的提问来源于stack exchange,提问作者Thodsaphorn Kaminthong
相关产品推荐
相关产品推荐

