使用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
相关产品推荐
相关产品推荐

