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

使用URLRequest发送POST请求失败 服务端收到GET请求且无参数

问题根因
  • 致命错误:创建dataTask时传入的参数是原始URL实例,不是你完成了POST配置、添加了请求头和请求体的URLRequest实例。URLSession接收到URL类型参数发起任务时,会默认构造GET请求,你之前对request变量做的所有自定义配置完全不会生效。这和Flask侧的现象完全吻合:请求方法是GET,请求头里没有你手动设置的Content-Type、Accept字段,只有系统默认给GET请求添加的通用头。
  • 冗余错误:不需要手动设置Content-Length请求头,URLSession会自动根据httpBody的实际长度计算并填充该字段,手动硬编码长度值很容易出现数值不匹配,导致服务端解析请求体失败。
修复后可直接运行的代码
guard let url = URL(string: urlString + "/someapi") else {
    return
}
var request = URLRequest(url: url)
request.httpMethod = "POST"
// 移除手动设置Content-Length的逻辑,交由系统自动处理
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("text/plain", forHTTPHeaderField: "Accept")
let bodyData = "f=1".data(using: .utf8)!
request.httpBody = bodyData

let completion = { (data: Data?, response: URLResponse?, error: Error?) in
    if let error = error {
        print("请求错误: \(error.localizedDescription)")
        return
    }
    // 此处处理响应逻辑
}
// 核心修复:传入配置完成的request对象,而非原始url
let task = session.dataTask(with: request, completionHandler: completion)
task.resume()
额外注意事项

如果修复上述问题后仍出现请求转GET的情况,检查Flask路由规则:如果路由定义带末尾斜杠(比如@app.route('/someapi/')),但请求的URL不带末尾斜杠,Flask会默认返回308重定向,部分客户端跟进重定向时会将POST请求转为GET,此时只需要把请求URL和路由规则的路径写完全一致即可。

修复后Flask侧可直接通过request.form.get('f')获取到值为1的参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:57:21