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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:36:59