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

Swift集成OwlBot词典API遇授权问题:请求无结果

Swift集成OwlBot API解码失败问题解决

核心问题

你用[DictionaryWord].self尝试解码数组,但OwlBot API实际返回的是一个包含数组的单个JSON对象(格式类似{"word":"bird","definitions":[]}),类型不匹配直接导致解码失败。

解决步骤

  1. 修正模型结构
    先定义完全匹配API返回格式的Codable模型:

    struct DictionaryResponse: Codable {
        let word: String
        let definitions: [DictionaryWord]
    }
    
    struct DictionaryWord: Codable {
        let type: String?
        let definition: String
        let example: String?
        let image_url: String?
        let emoji: String?
    }
    
  2. 调整解码逻辑
    将解码目标改为DictionaryResponse.self,再提取内部的definitions数组返回:

    struct APIReader {
        func getJSON(urlString: String, completion: @escaping ([DictionaryWord]?) -> Void) {
            guard let url = URL(string: urlString) else {
                completion(nil)
                return
            }
            var request = URLRequest(url: url)
            // 用setValue单独设置请求头,避免覆盖默认字段
            request.setValue("Token [你的API密钥]", forHTTPHeaderField: "Authorization")
            
            URLSession.shared.dataTask(with: request) { (data, response, error) in
                if let error = error {
                    print("请求错误: \(error.localizedDescription)")
                    completion(nil)
                    return
                }
                guard let data = data else {
                    print("无返回数据")
                    completion(nil)
                    return
                }
                
                // 打印返回的JSON字符串,直观对比结构
                if let jsonStr = String(data: data, encoding: .utf8) {
                    print("API返回内容: \(jsonStr)")
                }
                
                let decoder = JSONDecoder()
                do {
                    let responseModel = try decoder.decode(DictionaryResponse.self, from: data)
                    completion(responseModel.definitions)
                } catch {
                    // 捕获具体解码错误,快速定位问题
                    print("解码失败原因: \(error)")
                    completion(nil)
                }
            }.resume()
        }
    }
    
  3. 额外注意事项

    • 替换[你的API密钥]为真实密钥,确保Token与密钥之间有一个空格
    • 保留打印返回JSON的代码,能快速排查字段名拼写、类型匹配等问题
    • 用do-catch替代try?,可以获取具体的解码错误信息,避免无意义的静默失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:27:25