Swift向Django服务器发送JSON时请求体被识别为键的解决方法
问题解决:Swift发送JSON到Django时被当作QueryDict键的问题
问题原因
你遇到的情况是因为没有设置请求的Content-Type头,导致Django默认将请求体按照application/x-www-form-urlencoded(表单格式)解析。而你的请求体是纯JSON字符串,不符合表单的key=value格式,所以Django把整个JSON字符串当作了一个键,对应值为空数组。
解决方案
1. 修改Swift代码,添加Content-Type请求头
在构造URLRequest时,必须明确告诉服务器请求体是JSON格式:
static func send(url: URL, data: Data) async { var request = URLRequest(url: url) request.httpMethod = "POST" // 新增:设置Content-Type为application/json request.setValue("application/json", forHTTPHeaderField: "Content-Type") let json: [String: Any] = [ "order_details": ["meal_id":"6", "quantity":"1"], "restaurant_id": "1", "access_token": "FUJMNpU77OyuLiohOl5wzRQkGpHleV", "address": "13" ] do { // 替换try?为do-catch,避免忽略错误 let jsonData = try JSONSerialization.data(withJSONObject: json) request.httpBody = jsonData if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) } let (_, response) = try await URLSession.shared.data(for: request) guard let statusCode = (response as? HTTPURLResponse)?.statusCode, 200..<300 ~= statusCode else { throw URLError(.badServerResponse) } } catch { print(error) } }
2. 修改Django代码,正确解析JSON请求
Django的request.POST只处理表单格式的数据,JSON格式的请求需要从request.body中读取并解析:
import json if request.method == "POST": # 读取请求体并解析为JSON try: request_data = json.loads(request.body) print(request_data) # 现在可以正常访问字段,比如request_data["restaurant_id"] except json.JSONDecodeError: print("Invalid JSON format")
额外说明
- 避免用
try?忽略JSON序列化错误,否则如果JSON构造失败,httpBody会是nil,导致请求异常。 - 如果你的Django视图使用了Django REST framework的
@api_view,框架会自动处理JSON请求,直接用request.data即可获取解析后的字典。
内容的提问来源于stack exchange,提问作者Kuper
相关产品推荐
相关产品推荐

