Skip to main content

Swift API Manager -Alamofire-Refresh Token-With TestCases

  import Foundation import KeychainAccess enum APIError : Error { case accessTokenExpired case networkError // Add more error cases as needed } class APIManager { private let keychain = Keychain (service: "com.example.app.refreshToken" ) private let refreshTokenKey = "refreshToken" private var accessToken: String ? func callAPI < T : Codable >( urlString : String , method : String , parameters : [ String : Any ] ? , completion : @escaping ( Result < T , APIError >) -> Void ) { guard let url = URL (string: urlString) else { completion(.failure(.networkError)) return } var request = URLRequest (url: url) request.httpMethod = method // Add access token to the request headers if available if let token = accessToken { request.setValue( "Bearer \(token) " , forHTTPHeaderField: "Aut...

JSON Parsing with Codable in Swift - Nested JSON Model

#Swift, to supporting decoding and encoding we must adopt the #NSCoding protocol and implement its methods. 

#Apple has introduced a new way to decode and encode the #JSON data using with Codable since Swift 4. 

You need to consume the following API to search and display images. - Flickr

Https://www.flickr.com/services/api/flickr.photos.search.htm The API results in search results for a

Documentation on this page to get the image URLS:

https://www.flickr.com/services/api/misc.urls.html

XXXXXXXX - API Key

Open Test Api - https://api.flickr.com/services/rest/?method=flickr.galleries.getPhotos&api_key=XXXXXXXX&gallery_id=66911286-72157647277042064&format=json&nojsoncallback=1


Model: - 

import Foundation


struct ResponseCodable : Codable {

    let photos : Photos?

    let stat : String?


    enum CodingKeys: String, CodingKey {


        case photos = "photos"

        case stat = "stat"

    }


    init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: CodingKeys.self)

        photos = try values.decodeIfPresent(Photos.self, forKey: .photos)

        stat = try values.decodeIfPresent(String.self, forKey: .stat)

    }


}


struct Photos : Codable {

    let page : Int?

    let pages : Int?

    let perpage : Int?

    let total : Int?

    let photo : [Photo]?


    enum CodingKeys: String, CodingKey {


        case page = "page"

        case pages = "pages"

        case perpage = "perpage"

        case total = "total"

        case photo = "photo"

    }


    init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: CodingKeys.self)

        page = try values.decodeIfPresent(Int.self, forKey: .page)

        pages = try values.decodeIfPresent(Int.self, forKey: .pages)

        perpage = try values.decodeIfPresent(Int.self, forKey: .perpage)

        total = try values.decodeIfPresent(Int.self, forKey: .total)

        photo = try values.decodeIfPresent([Photo].self, forKey: .photo)

    }


}


struct Photo : Codable {

    let id : String?

    let owner : String?

    let secret : String?

    let server : String?

    let farm : Int?

    let title : String?

    let ispublic : Int?

    let isfriend : Int?

    let isfamily : Int?

    let is_primary : Int?

    let has_comment : Int?


    enum CodingKeys: String, CodingKey {


        case id = "id"

        case owner = "owner"

        case secret = "secret"

        case server = "server"

        case farm = "farm"

        case title = "title"

        case ispublic = "ispublic"

        case isfriend = "isfriend"

        case isfamily = "isfamily"

        case is_primary = "is_primary"

        case has_comment = "has_comment"

    }


    init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: CodingKeys.self)

        id = try values.decodeIfPresent(String.self, forKey: .id)

        owner = try values.decodeIfPresent(String.self, forKey: .owner)

        secret = try values.decodeIfPresent(String.self, forKey: .secret)

        server = try values.decodeIfPresent(String.self, forKey: .server)

        farm = try values.decodeIfPresent(Int.self, forKey: .farm)

        title = try values.decodeIfPresent(String.self, forKey: .title)

        ispublic = try values.decodeIfPresent(Int.self, forKey: .ispublic)

        isfriend = try values.decodeIfPresent(Int.self, forKey: .isfriend)

        isfamily = try values.decodeIfPresent(Int.self, forKey: .isfamily)

        is_primary = try values.decodeIfPresent(Int.self, forKey: .is_primary)

        has_comment = try values.decodeIfPresent(Int.self, forKey: .has_comment)

    }


}


Request method:-


        var photoList = [Photo]()



        if let url = URL(string: urlString) {

            if let data = try? Data(contentsOf: url) {

                // we're OK to parse!

                parse(json: data)

            }

        }




func parse(json: Data) {

        let decoder = JSONDecoder()

        do{

            let jsonPetitions = try decoder.decode(ResponseCodable.self, from: json)

            print(jsonPetitions)

            let dataInfo = jsonPetitions.photos?.photo

            photoList = dataInfo!

        }catch{

            print(error.localizedDescription)

        }

    }

Comments