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

C#发送POST请求到Flask返回400,Postman请求正常如何解决?

问题原因排查与解决方案

核心问题原因

  1. 编码问题:C#的StreamWriter默认使用带BOM(字节顺序标记)的UTF-8编码,Flask内置的JSON解析器无法识别带BOM的JSON内容,会直接返回400错误。
  2. 请求体不完整:写入流后没有主动刷入缓冲区,导致部分内容没有实际发送到服务器。
  3. 手动拼接JSON风险:如果变量中包含双引号、转义字符、换行符等特殊字符,手动拼接的JSON会出现格式错误,即使断点复制的单次内容正常,也存在隐性问题。

修复方案

方案1:直接写入序列化后的字节数组(最稳妥)

使用.NET内置的System.Text.Json序列化对象为不带BOM的UTF8字节数组,避免编码问题:

// 构造匿名对象,自动处理所有转义逻辑
var postData = new 
{
    comment = text,
    ua = userAgent,
    cookie = cookie,
    parent = parent
};
// 序列化为不带BOM的UTF8字节数组
byte[] jsonBytes = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(postData);

var url = "http://127.0.0.1:5000/";
var request = HttpWebRequest.CreateHttp(url);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
request.ContentLength = jsonBytes.Length;

// 直接写入请求流,不需要额外编码转换
using var requestStream = request.GetRequestStream();
await requestStream.WriteAsync(jsonBytes, 0, jsonBytes.Length);

var response = await request.GetResponseAsync();

方案2:修改StreamWriter编码

如果要保留StreamWriter的写法,显式指定不带BOM的UTF8编码:

// 用序列化库生成JSON,不要手动拼接
var data = System.Text.Json.JsonSerializer.Serialize(new 
{
    comment = text,
    ua = userAgent,
    cookie = cookie,
    parent = parent
});
var url = "http://127.0.0.1:5000/";
var request = HttpWebRequest.CreateHttp(url);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";

// 第二个参数false表示不输出BOM标记
await using var sw = new StreamWriter(request.GetRequestStream(), new System.Text.UTF8Encoding(false));
await sw.WriteAsync(data);
// 主动刷流确保所有内容写入请求体
await sw.FlushAsync();

var response = await request.GetResponseAsync();

方案3:使用HttpClient(推荐,HttpWebRequest已过时)

HttpClient是微软官方推荐的HTTP请求类,性能更高,内置JSON序列化支持,不需要手动处理流和编码:

// 注意:HttpClient应该全局静态初始化,不要每次请求都新建实例
private static readonly HttpClient _httpClient = new HttpClient();

// 发送请求的逻辑
var postData = new 
{
    comment = text,
    ua = userAgent,
    cookie = cookie,
    parent = parent
};
// 直接发送JSON请求,自动处理编码、序列化、流操作
var response = await _httpClient.PostAsJsonAsync("http://127.0.0.1:5000/", postData);
// 校验请求状态,非2xx状态会抛出异常
response.EnsureSuccessStatusCode();
// 读取返回结果
string result = await response.Content.ReadAsStringAsync();

调试技巧

如果后续遇到类似问题,可以在Flask侧打印原始请求信息,快速定位问题:

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def process():
    print("请求头:", dict(request.headers))
    print("原始请求体字节:", request.get_data())
    print("解析后的JSON:", request.json)
    return 'Hello'

app.run(debug=True)

内容的提问来源于stack exchange,提问作者JohnWick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:06