Swift集成OwlBot词典API遇授权问题:请求无结果
Swift集成OwlBot API解码失败问题解决
核心问题
你用[DictionaryWord].self尝试解码数组,但OwlBot API实际返回的是一个包含数组的单个JSON对象(格式类似{"word":"bird","definitions":[]}),类型不匹配直接导致解码失败。
解决步骤
修正模型结构
先定义完全匹配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? }调整解码逻辑
将解码目标改为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() } }额外注意事项
- 替换
[你的API密钥]为真实密钥,确保Token与密钥之间有一个空格 - 保留打印返回JSON的代码,能快速排查字段名拼写、类型匹配等问题
- 用
do-catch替代try?,可以获取具体的解码错误信息,避免无意义的静默失败
- 替换
内容的提问来源于stack exchange,提问作者Nichke J
相关产品推荐
相关产品推荐

