swift

How to make an API call with Swift?


So I'm practising trying to make API calls with Swift. The code is as below:

struct Example: Codable {
    let userID: String
    let ID: String
    let title: String
    let completed: String
}


func getJson(completion: @escaping (Example)-> ()) {
    let urlString = "https://jsonplaceholder.typicode.com/todos/1"
    if let url = URL(string: urlString) {
        URLSession.shared.dataTask(with: url) {data, res, err in
            if let data = data {

                let decoder = JSONDecoder()
                if let json: Example = try? decoder.decode(Example.self, from: data) {
                    completion(json)
                }
            }
        }.resume()
    }
}

getJson() { (json) in
    print(json.ID)
}

However, I am unable to print out anything when getJson is called. The example API I used is found here. The tutorial that I used to help me write the code is found here.


Solution

  • Modified your variable name and data type exactly as your API response.

    struct Example: Codable {
        let userId: Int
        let id: Int
        let title: String
        let completed: Bool
    }
    
    func getJson(completion: @escaping (Example)-> ()) {
        let urlString = "https://jsonplaceholder.typicode.com/todos/1"
        if let url = URL(string: urlString) {
            URLSession.shared.dataTask(with: url) {data, res, err in
                if let data = data {
                    
                    let decoder = JSONDecoder()
                    do {
                        let json: Example = try! decoder.decode(Example.self, from: data)
                        completion(json)
                    }catch let error {
                        print(error.localizedDescription)
                    }
                }
            }.resume()
        }
    }
    
    getJson() { (json) in
        print(json.id)
    }
    

    You can also use CodingKey and can change your response during the init period.

    struct Example: Codable {
        var userID: Int
        var ID: Int
        var title: String
        var completed: Bool
     
        enum CodingKeys: String, CodingKey {
            case userID = "userId"
            case ID = "id"
            case title = "title"
            case completed = "completed"
        }
        
        init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            userID = try values.decode(Int.self, forKey: .userID)
            ID = try values.decode(Int.self, forKey: .ID)
            title = try values.decode(String.self, forKey: .title)
            completed = try values.decode(Bool.self, forKey: .completed)
            title = "Title: \(title)"
        }
    }
    
    func getJson(completion: @escaping (Example)-> ()) {
        let urlString = "https://jsonplaceholder.typicode.com/todos/1"
        if let url = URL(string: urlString) {
            URLSession.shared.dataTask(with: url) {data, res, err in
                if let data = data {
                    do {
                        let json: Example = try JSONDecoder().decode(Example.self, from: data)
                        completion(json)
                    }catch let error {
                        print(error.localizedDescription)
                    }
                }
            }.resume()
        }
    }
    
    getJson() { (json) in
        print("ID: \(json.ID) \(json.title)")
    }