首页 > 解决方案 > 如何获得从 API Swift 检索数据的授权?

问题描述

我正在尝试从 API 检索一些数据,但出现错误:“给定的数据不是有效的 JSON”,状态代码:401

我认为这是一个身份验证问题。如何设置身份验证凭据以发出 GET 请求?

这是从 JSON 中检索数据的代码。

    func loadData()
    {
    guard let url = URL(string: getUrl) else { return }
        
        URLSession.shared.dataTask(with: url) { data, res, err in
            do {
                if let data = data {
                    let result = try JSONDecoder().decode([ItemsModel].self, from: data)
                    DispatchQueue.main.async {
                        self.items = result
                    }
                    
                   
                } else {
                    print(" No Data ")
                }
            } catch( let error)
            {
                print(res)
                print(String(describing: error))
            }
        
            
            
        }.resume()
    }

这是视图的代码:

struct GetView: View {
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        NavigationView {
            VStack {
            List(viewModel.items, id: \.id) { item in
                Text(item.year)
            }
            } .onAppear(perform: {
                viewModel.loadData()
                    
            })

            .navigationTitle("Data")
        }
        
    }
}

标签: jsonswiftapiswiftui

解决方案


要处理身份验证,您必须为您的 URLSession 实现一个委托:

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        completionHandler(.performDefaultHandling, challenge.proposedCredential)
    }

但是,您的 401 错误可能是由于您的代码未向服务器发送有效的 GET 请求。您可能想要解码“res”值以确定状态代码:

if let response = res as? HTTPURLResponse {
    if response.statusCode != 200 {
        // data may be JSON encoded but you should get some for
        // statusCode == 401
    }
}

在不知道您要连接的服务类型的情况下,很难推测您是否需要 GET 或 POST。您使用的 URL 可能需要查询参数。


推荐阅读