Swift应用对接Flask后端:json.dumps()处理请求数据报错求助
解决Flask中
json.dumps(request.data)的报错问题 我来帮你搞定这个问题!你遇到的错误根源在于对Flask里request.data的类型理解有误,咱们一步步拆解:
问题分析
Swift端的代码是没问题的:你把字典转成JSON字节数据作为请求体发送,这部分逻辑正确。但在Flask这边,request.data是原始的字节类型数据,而json.dumps()的作用是把Python可序列化对象(比如字典、列表)转换成JSON字符串——直接给它传字节数据,Python肯定会报错,因为字节对象本身不能被JSON序列化。
解决方案
你需要先把收到的字节数据解析成Python字典,再进行JSON序列化操作。Flask还提供了更便捷的内置方法来处理JSON请求体,下面两种方法都可以:
方法1:手动解析request.data
先使用json.loads()把字节数据转成Python字典,再用json.dumps()打印:
@app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "GET": return "GET requested" elif request.method == "POST": try: # 把字节数据解析为Python字典 request_dict = json.loads(request.data) # 格式化打印JSON字符串,更易读 print(json.dumps(request_dict, indent=2)) return "HI" except json.JSONDecodeError: # 处理无效JSON的情况 return "Invalid JSON format", 400 else: return "Invalid"
方法2:使用Flask内置的request.get_json()
这个方法会自动帮你解析JSON请求体,还会检查请求头的Content-Type是否为application/json,推荐用这个:
@app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "GET": return "GET requested" elif request.method == "POST": # 自动解析JSON请求体,解析失败返回None request_dict = request.get_json() if request_dict is None: return "Invalid JSON or missing Content-Type header", 400 print(json.dumps(request_dict, indent=2)) return "HI" else: return "Invalid"
额外优化:Swift端添加请求头
为了让Flask的get_json()能正常工作,建议在Swift代码里添加Content-Type请求头,明确告诉服务器发送的是JSON数据:
import UIKit let url = URL(string: "http://192.168.0.24:8080/login")! var request = URLRequest(url: url) request.httpMethod = "POST" // 添加这行,指定请求体类型为JSON request.setValue("application/json", forHTTPHeaderField: "Content-Type") let param = ["username": "admin", "password": "admin"] request.httpBody = try JSONSerialization.data(withJSONObject: param, options: []) let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in if let data = data { print(String(data: data, encoding: .utf8)!) } }.resume()
这样修改后,你就能正常打印出Swift发送的JSON数据,不会再报错啦!
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

