簡體   English   中英

使用 URLSession.shared.dataTask 發出 api 請求

[英]Making an api request using URLSession.shared.dataTask

我正在發出 api 請求:

var urlRaw = bookSummaryReadsDomainUrl + apiKey;
let url = URL(string: urlRaw.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)

let task = URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
    if let error = error {
        print("Error with fetching book summary reads: \(error)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse,
        (200...299).contains(httpResponse.statusCode) else {
            print("Error with the response, unexpected status code: \(response)")
            return
    }
    if let data = data,
        let flurryItems = try? JSONDecoder().decode(FlurrySummary.self, from: data) {
        completionHandler(flurryItems.rows ?? [])
    }
})
task.resume()

到返回以下數據的端點

{
"rows": [
{
"dateTime": "2020-07-04 00:00:00.000-07:00",
"event|name": "BookSummaryRead",
"paramName|name": "bookId",
"paramValue|name": "elon-musk",
"count": 12
},

... ]

import Foundation

struct FlurrySummary: Codable {
    var rows: [FlurryItem]?
    enum CodingKeys: String, CodingKey {
        case rows = "rows"
    }
}


struct FlurryItem: Codable {
    var name: String?
    var event: String?
    var value: String?
    var count: String?
    var date: String?
    enum CodingKeys: String, CodingKey {
        case name = "paramName|name"
        case event = "event|name"
        case value = "paramValue|name"
        case count = "count"
        case date = "dateTime"
    }
}

由於某種原因 JSONDecoder.decode 部分不起作用。 它沒有填滿flurryItems 和flurryItems.rows = nil。 我究竟做錯了什么?

FlurryItem中的屬性count必須是Int類型。

var count: Int?

您必須捕獲拋出的Error

do {
    if let data = data,
        let flurryItems = try JSONDecoder().decode(FlurrySummary.self, from: data) {
        completionHandler(flurryItems.rows ?? [])
    }
} catch { print(error) }

此外,您不需要CodingKeys中的FlurrySummary ,因為屬性名稱相同。

struct FlurrySummary: Codable {
    var rows: [FlurryItem]?
}

注意:此外,如果屬性永遠不會變為null ,請避免使用optional聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM