json - 如何获得从 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")
}
}
}
解决方案
要处理身份验证,您必须为您的 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 可能需要查询参数。
推荐阅读
- python - 如果表有多个类,如何单击,这是 gmail 搜索部分,我已附上截图,请检查
- javascript - HttpMessageNotWritableException:无法写入 JSON:EL1025E:集合包含“0”个元素,索引“0”无效
- android - PagerAdapter.getItem() 崩溃并出现 IllegalStateException:已添加片段
- angular - 使用 Twilio Media Streams 和 Google Speech-to-Text 编写实时转录电话时出错
- python - 是否可以在另一个views.py方法中访问通过HTML表单提交的、在预览页面中呈现的值
- angular - 如何在 Jasmine 中模拟 Angular 9 中的大量依赖项的依赖模块?
- unity3d - 如何让宇宙飞船掉头?
- java - 为什么java线程在独立代码之后执行?
- google-cloud-platform - GCP - 有没有办法在实例级别获取账单行项目
- java - 如何使用 Apache POI 4.1.2 在 XSSFChart 中仅设置绘图区域高度