iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Mobile Development

Swift大航道-啟航篇系列 第 22

swift 天氣API-呼叫api

  • 分享至 

  • xImage
  •  

請求api

首先我們先定義一個返回正確url的func

// 定義一個func叫LegitimateURL,並給定參數是原本的URL,並返回url的物件
func LegitimateURL(requestURL: String) -> URL {
        let legitimateURL = requestURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        // 創建一個url,並強制解包legitimateURL,代表legitimateURL不能為空值
        let url = URL.init(string: legitimateURL!)
        return url!
    }
  • addingPercentEncoding(withAllowedCharacters:):
    這個方法用來處理 URL 中的特殊字符(例如空格、符號等),確保它們以正確的格式出現在 URL 中。

  • urlQueryAllowed:
    定義了在 URL 查詢中允許的符號。使用這個符號集可以確保請求 URL 中的所有符號都能被正確編碼。

https://opendata.cwa.gov.tw/dist/opendata-swagger.html#/%E9%A0%90%E5%A0%B1/get_v1_rest_datastore_F_C0032_001

func callAPI() {  
        // 這邊強制解包剛剛選取的selectedArea
        // 
        let city = "\(selectedArea!)"
        let requestURL = LegitimateURL(requestURL: "這邊是你的requestURL,因會員授權碼關係,所以這邊不公開給大家,大家可以去上方網址找尋自己的喔" + city)

這邊一樣是在callAPI的func裡面喔!

// 這邊是用URLSession.shared.dataTask發送請求,這是一個異步處理喔,這邊的self是防止閉包的循環引用的問題
URLSession.shared.dataTask(with: requestURL) { [self]
            (data, response, error) in
            // 錯誤處理,如請求失敗則返回錯誤訊息
            if let error = error {
                print(error.localizedDescription)
            }
            // 將response轉換為HTTPURLResponse,並 print 出HTTPURLResponse
            if let response = response {
                print("====================")
                print(response as! HTTPURLResponse)
                print("====================")

            }            
if let data = data {
                let decoder = JSONDecoder()
                
                do {
                    self.weatherData2 = try decoder.decode(weatherData.self, from: data)
                    
                    print("====================")
                    print(weatherData2 ?? "")
                    print("====================")
                    
                    //主線成
                    DispatchQueue.main.async {
                        self.TView.reloadData()
                    }
                    
                    
                } catch {
                    print(error.localizedDescription)
                }
            }
        }.resume()

這邊的程式是先看是否有資料傳送進來,並用JSONDecoder解析成weatherdata類型的實例,如果解析成功就儲存在weatherData2,並print出來。
而主線成就是用來更新tableview的資料
.resume()啟動請求

結論

這段程式碼的主要作用是發送一個 GET 請求到特定的 API,獲取天氣數據,解析這些數據,然後在主線程上更新tableview。如果出現任何錯誤,會打印出錯誤信息。這是一個最簡單也是最普通的請求方式,明天繼續會跟大家分享天氣api的專案喔!


上一篇
swift 天氣API-建立結構
下一篇
swift 天氣API-抓取資料
系列文
Swift大航道-啟航篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言