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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:57:30