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

Xcode Swift中Alamofire请求JSON序列化失败问题求助

问题排查与修复方案

核心问题定位

从错误日志里的Server Error: <pre>Cannot POST /v2/search/</pre>可以直接确定:

  • 当前请求的API端点/v2/search/不支持POST方法,或路径格式不符合接口要求
  • 服务器返回的是HTML错误页面,而非预期的JSON数据,导致Alamofire无法完成JSON序列化,触发格式错误提示

具体修复步骤

1. 修正API请求方法与路径

Nutritionix Track API的/v2/search端点实际仅支持GET请求,且路径结尾不需要额外斜杠。修改代码如下:

let brandName = restaurantField.text!
let foodName = itemNameField.text!
// 移除路径结尾的斜杠,修正为正确的API地址
let url = "https://trackapi.nutritionix.com/v2/search"

2. 调整身份验证参数的位置

新版本Nutritionix API要求appId和appKey放在请求头中,而非请求体参数里。先构造请求头:

// 构造身份验证请求头
let headers: HTTPHeaders = [
    "x-app-id": "66ebb194",
    "x-app-key": "2e43991be685bcd5836574dda12e4625",
    "Content-Type": "application/json"
]

同时从params中移除appId和appKey字段:

let params = [
    "queries":[
        "food_name":foodName,
        "brand_name":brandName
    ],
    "fields":["item_name","brand_name","nf_total_carbohydrate","nf_serving_size_qty","nf_serving_size_unit"],
    "filters":[
        "item_type":1
    ]
] as [String : Any]

3. 更新请求方法与编码方式

将请求方法从.post改为.get,并使用URLEncoding.default编码参数:

AF.request(url, method: .get, parameters: params, encoding: URLEncoding.default, headers: headers).responseJSON { response in
    // 后续处理逻辑
}

4. 修复JSON解析的安全隐患

原代码中try! JSON(data: response.data!)存在崩溃风险,改为安全的可选绑定与错误捕获:

if let data = response.data {
    do {
        let json = try JSON(data: data)
        if let objects = json["hits"].array {
            // 遍历解析数据逻辑
        }
    } catch {
        print("JSON解析失败: \(error)")
    }
}

5. 优化冗余的错误处理逻辑

合并重复的错误代码块,简化处理流程:

AF.request(url, method: .get, parameters: params, encoding: URLEncoding.default, headers: headers).responseJSON { response in
    switch response.result {
    case .success(let value):
        print("请求成功,返回数据: \(value)")
        if let data = response.data {
            do {
                let json = try JSON(data: data)
                if let objects = json["hits"].array {
                    self.items.removeAll()
                    for object in objects {
                        self.items.append(Item(json: object.dictionaryValue))
                    }
                    self.tableView.reloadData()
                    self.itemNameField.text = ""
                    self.restaurantField.endEditing(true)
                    self.itemNameField.endEditing(true)
                    
                    if self.items.isEmpty {
                        let alert = UIAlertController(title: "未找到搜索结果", message: nil, preferredStyle: .alert)
                        alert.addAction(UIAlertAction(title: "确定", style: .default))
                        self.present(alert, animated: true)
                    }
                }
            } catch {
                print("JSON解析失败: \(error)")
            }
        }
    case .failure(let error):
        print("\n\n===========错误详情===========")
        print("错误码: \(error._code)")
        print("错误信息: \(error.localizedDescription)")
        if let data = response.data, let str = String(data: data, encoding: .utf8) {
            print("服务器返回内容: " + str)
        }
        debugPrint(error)
        print("===========================\n\n")
    }
}

额外验证建议

  • 确认你的API密钥和App ID未过期、未被平台限制
  • 先用Postman等工具手动发送GET请求测试接口,确认返回正常JSON后再修改App代码

内容的提问来源于stack exchange,提问作者Johnd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:04:56