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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:37:49