在日常開發中,我們經常需要從後端服務的某個接口擷取資料來展示,這些接口通過以http的方式調用,下面介紹一下如何在swift中調用http接口
編寫http調用函數
以http get為例,編寫以下代碼:
import Foundation
// 這裡需要替換成實際的位址
let requestHost = "localhost:8080"
func httpGet<T: Decodable>(uri: String, cb: @escaping(_ responseValue: T) -> ()) -> Void {
// Create a URLRequest for an API endpoint
let urlStr = "http://\(requestHost)/\(uri)"
let url = URL(string: urlStr)!
let urlRequest = URLRequest(url: url)
// 如果是POST請求,通過urlRequest.httpMethod = "POST"來設定http method為POST
// Create the HTTP request
let session = URLSession.shared
let callback = cb
let task = session.dataTask(with: urlRequest) { (data, response, error) in
if error != nil {
print("Couldn't load \(url) from main bundle:\n\(String(describing: error))")
fatalError("Couldn't load \(url) from main bundle:\n\(String(describing: error))")
}
// decode json
do {
let str = String(decoding: data!, as: UTF8.self)
print("response data: \(str)")
let jsonData = str.data(using: .utf8)
let responseValue = try JSONDecoder().decode(T.self, from: jsonData! )
callback(responseValue)
} catch {
print("Error during JSON serialization \(String(describing: data)): \(error.localizedDescription)")
fatalError("Error during JSON serialization: \(error)")
}
}
// start
task.resume()
}
httpGet方法以uri為參數,并通過cb做請求結果的回調處理。
如果想要使用http post的方式調用接口,在合建urlRequest後在urlRequest上設定method:
let urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
編寫響應資料結構
假設接口的傳回資料結構如下:
import Foundation
struct ResponseData: Decodable {
var data: [UserInfo]
var totalCount: Int
var pageSize: Int
var pageNum: Int
}
struct UserInfo: Decodable {
var userId: Int
var userName: String
}
定義表示response的結構體:
struct Response<T: Decodable>: Decodable {
var status: Int
var success: Bool
var data: T
}
需要注意的是,這裡的結構體都需要實作Decodable協定
調用httpGet執行接口請求
在編寫好httpGet函數和接口響應資料模型後,我們通過一個簡單的按鈕操作來執行接口調用:
import SwiftUI
struct Search: View {
@Environment(\.presentationMode) var mode
@State var param = SearchParam()
var body: some View {
VStack {
Button("查詢") {
// do query and turn back
let uri = "/queryUserList" + self.param.toQueryStr()
httpGet(uri: uri) { (resp: Response<ResponseData>) in
let data = resp.data.data
// 省略修改資料的代碼
}
}
}
.padding()
.navigationBarTitleDisplayMode(.inline)
}
}
至此,我們完成了swift調用http接口的功能開發