【问题标题】:Flask 400 Bad Request when sent from C# App, but 200 from Postman?从 C# 应用程序发送 Flask 400 Bad Request,但从 Postman 发送 200?
【发布时间】:2021-11-02 15:53:53
【问题描述】:

我将以下 JSON 发布到我的 Flask 服务器:

{"comment": "astute observation", "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36", "cookie": "ua=f8256d37159e3faf28ae61a6406601c3; platform=pc; bs=bxa7ziiq07dufk31prvoo0mbfm44sayh; ss=994139249854417186; il=v1qyca8PU7X6jSwgiqceXsySwWB60HnCjSJ1HjNmsSxRUxNjQzNjA3OTEycUVTTFoxWUpSZDFTZ3kwclIzenBHa19FbnlmMTlIN0hZeHNDQ1FOLQ..; expiredEnterModalShown=1", "parent": "860245961"}

当从 Postman 发送时,请求可以完美运行。但是,当从我的 C# 应用程序发送时,服务器会返回 400 Bad Request 错误代码。

var data = $"{{\"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";
await using var sw = new StreamWriter(request.GetRequestStream());
await sw.WriteAsync(data);
var response = await request.GetResponseAsync();

为了确保 JSON 格式正确,我设置了一个断点并检查了“数据”变量。我将该值复制/粘贴到 Postman 中,将 Content-Type 设置为 application/json,请求从那里成功,但在我的 C# 应用程序中失败。

服务器代码:

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def process():
    print(request.json)
    return 'Hello'

app.run(debug=True)

编辑:发布后,我意识到我没有从我的 C# 应用程序发送用户代理。我尝试添加一个,但服务器仍然响应 400 Bad Request 错误。

编辑 2:我尝试简化数据变量以进行测试。 var data = "{\"msg\": \"david\"}"; 和设置 request.ContentLength = data.Length,仍然有同样的问题。真奇怪。

【问题讨论】:

  • 不熟悉 C# 中的这种字符串变体 - 以 $ 开头的字符串。数据是用替换的内容扩展出来的,还是在其他地方完成的
  • 能否提供data的最终值的样本?
  • @FranzGleichmann 它包含在我的帖子中,取自设置断点并从我的 IDE 复制数据值。
  • @cup 是一个模板字符串,相关行执行后的数据值包含在我的帖子顶部。双大括号在这里计算为单大括号,因为单大括号用于注入变量。处理 JSON 时有点混乱,但它会生成一个有效的 JSON 字符串(与我使用 Postman 发送的字符串相同,但没有收到 400 Bad Request)。

标签: c# flask


【解决方案1】:

很奇怪,但这解决了问题。使用 StreamWriter 类导致了这个问题。这样做最终会导致 200 OK 响应。

using var stream = request.GetRequestStream();
await stream.WriteAsync(Encoding.UTF8.GetBytes(data));

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多