使用URLSession获取需认证JSON时遭遇401 Authorization Error求解决
解决Basic Auth导致的401错误问题
我来帮你分析下代码里的潜在问题,以及如何修复这个401认证失败的情况:
可能的问题点
- 你把Authorization头加到了
URLSessionConfiguration里,但如果服务器期望认证信息直接附在请求对象上,或者session配置的头没有被正确应用到请求中,就会导致凭证没被服务器接收到。 - 代码里的强制解包(
url!、userPasswordData!)可能隐藏了URL无效、字符串转数据失败这类潜在问题,但这不是401错误的直接诱因。
修正后的代码方案
更可靠的方式是直接把Authorization头添加到URLRequest对象中,同时改用Swift原生的API写法,避免不必要的强制解包:
func retrieveJSON() { let login = "login@mail.com" let password = "password" // 先校验URL有效性,避免强制解包崩溃 guard let url = URL(string: "http://server/admin/data.json") else { print("Invalid server URL") return } var request = URLRequest(url: url) let userPasswordString = "\(login):\(password)" // 校验凭证转数据是否成功 guard let userPasswordData = userPasswordString.data(using: .utf8) else { print("Failed to encode credentials") return } let base64EncodedCredential = userPasswordData.base64EncodedString() let authString = "Basic \(base64EncodedCredential)" // 直接给请求设置Authorization头 request.setValue(authString, forHTTPHeaderField: "Authorization") let session = URLSession.shared let task = session.dataTask(with: request) { data, response, error in if let error = error { print("Request failed with error: \(error)") return } debugPrint(response) // 这里可以添加数据解析逻辑 } task.resume() }
额外排查建议
- 确认服务器确实支持Basic Authentication:有些服务器可能使用Digest Auth或自定义认证机制,这时候Basic Auth的头格式是无效的。
- 核对用户名和密码的准确性:注意大小写、特殊字符(比如密码里的@、#等是否在编码时出现异常)。
- 如果服务器用HTTPS,检查是否存在证书信任问题(不过401是认证错误,不是SSL证书错误,但也可以留意)。
内容的提问来源于stack exchange,提问作者Tariq Oliver
相关产品推荐
相关产品推荐

