Swift调用API获取数据报401错误,如何添加授权凭证?
Swift GET请求添加授权凭证解决401错误方案
401状态码代表服务端未通过你的身份校验,返回的响应内容不是预期的JSON结构,才会触发JSON解析失败报错。你当前的代码直接传入URL发起请求,没有携带授权所需的请求头,是问题的核心原因。
以下是修改后的完整实现,默认适配最常用的Bearer Token(JWT类凭证)鉴权场景:
func loadData() { guard let url = URL(string: getUrl) else { return } // 构造URLRequest对象自定义请求参数 var request = URLRequest(url: url) // 指定请求方法为GET request.httpMethod = "GET" // 替换为你实际的授权凭证 let authToken = "替换为接口要求的真实Token" request.setValue("Bearer \(authToken)", forHTTPHeaderField: "Authorization") URLSession.shared.dataTask(with: request) { data, res, err in // 新增状态码校验,仅200状态码走正常解析逻辑 guard let httpResponse = res as? HTTPURLResponse, httpResponse.statusCode == 200, let data = data else { // 调试逻辑:打印错误响应内容便于排查 if let data = data, let errStr = String(data: data, encoding: .utf8) { print("服务端错误返回:\(errStr)") } print("请求失败,状态码:\((res as? HTTPURLResponse)?.statusCode ?? -1)") return } do { let result = try JSONDecoder().decode([ItemsModel].self, from: data) DispatchQueue.main.async { self.items = result } } catch let error { print("JSON解析错误:\(error)") // 调试逻辑:打印实际响应内容定位结构差异 if let resStr = String(data: data, encoding: .utf8) { print("实际响应内容:\(resStr)") } } }.resume() }
如果你的接口使用Basic Auth鉴权,替换上述设置Authorization头的代码即可:
// Basic Auth凭证构造逻辑 let username = "你的接口用户名" let password = "你的接口密码" let loginString = "\(username):\(password)" guard let loginData = loginString.data(using: .utf8) else { return } let base64LoginString = loginData.base64EncodedString() request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
- 凭证字段名、格式请严格按照你对接的接口文档要求填写,部分特殊接口的授权头可能不使用
Authorization作为字段名,请以文档说明为准 - 新增的调试打印逻辑可以帮助你快速定位后续可能出现的接口参数、返回结构差异问题
内容的提问来源于stack exchange,提问作者Exal
相关产品推荐
相关产品推荐

