You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:12:48