天天看點

新手學IOS開發-使用HttpRequest調用http接口

作者:coderjack

在日常開發中,我們經常需要從後端服務的某個接口擷取資料來展示,這些接口通過以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接口的功能開發

繼續閱讀