无需使用第三方库即可发出HTTP请求的更快方法
介绍
如今,应用程序不断从网络上下载数据。当您使用应用程序进行搜索时,将调用一个端点。将结果数据下载,放入对象中,然后在几毫秒内显示给您。
为了发出HTTP网络请求,开发人员通常倾向于添加第三方项目,例如Alamofire。但是通常,该库具有比所需更多的功能,并且会占用大量无用的空间。
在本文中,我们将讨论如何URLSession
用于发出HTTP请求并将JSON结果序列化为对象。
入门
首先,打开Xcode然后创建一个新项目。选择单视图应用程序。
现在,在屏幕中央创建一个按钮,点击该按钮将调用我们的API方法。
实作
首先,我们需要发出HTTP请求。对于此示例,我将使用来自jsonplaceholder的终结点,这是一个伪造的在线REST API,用于每月进行超过3.5亿个请求的测试和原型制作!
该终端将返回的职位名单与userId
,postId
,title
,和body
。
let session = URLSession.shared
let url = URL(string:“ https://jsonplaceholder.typicode.com/posts”)!
然后,我们将创建一个dataTask
调用URLSession.dataTask方法。这将创建一个任务,从URL集中检索内容,并在请求完成后调用处理程序:
let task = session.dataTask(with:url, completeHandler :{data,response,error in
//检查响应
print(error)
print(response)
})
task.resume()
注意:不要忘记task.resume()
在最后调用,否则请求将不会执行。
如果现在运行代码,您将在控制台中看到HTTP响应,如下所示:
您可能会问我们的数据在哪里,对不对?简单地说:在方法data
返回的参数中dataTask
。如果我们尝试打印它,我们将看到以字符串形式返回的JSON-但我们需要在自定义对象中使用它。我们该怎么做?
我们可以手动创建我们的类userId
,id
,title
,和body
作为属性或使用做一个更快的方式quicktype.io。
import Foundation
class Post: Codable {
let userID, id: Int
let title, body: String
enum CodingKeys: String, CodingKey {
case userID = "userId"
case id, title, body
}
init(userID: Int, id: Int, title: String, body: String) {
self.userID = userID
self.id = id
self.title = title
self.body = body
}
}
然后回到您的ViewController
文件,并将之前的代码更改为以下代码:
let session = URLSession.shared
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
let task = session.dataTask(with: url, completionHandler: { data, response, error in
// Check the response
print(response)
// Check if an error occured
if error != nil {
// HERE you can manage the error
print(error)
return
}
// Serialize the data into an object
do {
let json = try JSONDecoder().decode([Post].self, from: data! )
//try JSONSerialization.jsonObject(with: data!, options: [])
print(json)
} catch {
print("Error during JSON serialization: \(error.localizedDescription)")
}
})
task.resume()
测试时间
我们终于准备好启动我们的应用程序,并尝试进行API调用。
由于我们的应用程序还没有真正的界面,因此我将在断点处将JSON解码为对象。
如果将我们的对象添加到变量视图,我们将看到它正确包含了从端点获取的所有数据。
网友评论