본문 바로가기
UIKit/기본

공공 API를 어떻게 갖고 오나? (공공 API를 GET 하는 방법)

by 밤새는탐험가 2024. 4. 9.

먼저 스위프트로 API를 갖고 오는 코드 구현 

 

  • URL 구조체 생성

URL은 옵셔널 바인딩 처리를 해야 한다.

주소는 아이튠즈 API 갖고 왔다. 

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/Searching.html#//apple_ref/doc/uid/TP40017632-CH5-SW1

 

iTunes Search API: Constructing Searches

 

developer.apple.com

guard let url = URL(string: "https://itunes.apple.com/search?&term=jazz") else {
    print("Error: cannot create URL")
    return
}
  • URL 요청 생성
var request = URLRequest(url: url)
request.httpMethod = "GET"

 

  • 요청을 가지고 작업 진행

위에서 생성한 request를 통해 dataTask(with: )을 통해 처리한다.

⭐️ 이 때 dataTask(with: )은 비동기 처리한다. 

URLSession.shared.dataTask(with: request) { data, response, error in
        // 에러가 없어야 넘어감
        guard error == nil else {
            print("Error: error calling GET")
            print(error!)
            return
        }
        // 옵셔널 바인딩
        guard let safeData = data else {
            print("Error: Did not receive data")
            return
        }
        // HTTP 200번대 정상코드인 경우만 다음 코드로 넘어감
        guard let response = response as? HTTPURLResponse, (200 ..< 299) ~= response.statusCode else {
            print("Error: HTTP request failed")
            return
        }

        // 원하는 모델이 있다면, JSONDecoder로 decode코드로 구현 ⭐️
        print(String(decoding: safeData, as: UTF8.self))


    }.resume()     // 시작

 

 

▶️ 전체 코드 

 

func getMethod() {

    // URL구조체 만들기
    guard let url = URL(string: "https://itunes.apple.com/search?term=jazz") else {
        print("Error: cannot create URL")
        return
    }
    
    // URL요청 생성
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    
    
    // 요청을 가지고 작업세션시작
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        // 에러가 없어야 넘어감
        guard error == nil else {
            print("Error: error calling GET")
            print(error!)
            return
        }
        // 옵셔널 바인딩
        guard let safeData = data else {
            print("Error: Did not receive data")
            return
        }
        // HTTP 200번대 정상코드인 경우만 다음 코드로 넘어감
        guard let response = response as? HTTPURLResponse, (200 ..< 299) ~= response.statusCode else {
            print("Error: HTTP request failed")
            return
        }

        // 원하는 모델이 있다면, JSONDecoder로 decode코드로 구현 ⭐️
        print(String(decoding: safeData, as: UTF8.self))


    }.resume()     // 시작
}

 

 

 

위에서 처럼 보면 보기 어렵기 때문에 

이 때 "Postman"이라는 어플을 사용하여 출력된 내용을 보기 쉽게 한다. 

 

 

 

데이터 모델 구조를 확인하고, 

이를 통해 재구성하기 위해서는 아래 사이트에 들어가서 조회한다. 

 

아래 사이트 주소에 들어가서 Postman의 출력 결과를 붙여 넣기 하면

데이터 모델에 대해 알 수 있게 된다. 

 

https://app.quicktype.io/

 

Instantly parse JSON in any language | quicktype

 

app.quicktype.io

 

 

아래 코드는 위의 사이트 들어가서 출력된 JSON 파일에 대해 

데이터 모델을 확인할 수 있다. 

 

 

import Foundation

// MARK: - Welcome
struct Welcome: Codable {
    let resultCount: Int
    let results: [Result]
}

// MARK: - Result
struct Result: Codable {
    let wrapperType: WrapperType
    let artistID, collectionID: Int
    let amgArtistID: Int?
    let artistName, collectionName, collectionCensoredName: String
    let artistViewURL, collectionViewURL: String
    let artworkUrl60, artworkUrl100: String
    let collectionPrice: Double
    let collectionExplicitness: Explicitness
    let trackCount: Int
    let copyright: String?
    let country: Country
    let currency: Currency
    let releaseDate: Date
    let primaryGenreName: String
    let previewURL: String
    let description: String?
    let kind: Kind?
    let trackID: Int?
    let trackName, trackCensoredName: String?
    let trackViewURL: String?
    let artworkUrl30: String?
    let trackPrice: Double?
    let trackExplicitness: Explicitness?
    let discCount, discNumber, trackNumber, trackTimeMillis: Int?
    let isStreamable: Bool?
    let contentAdvisoryRating, shortDescription, longDescription, collectionArtistName: String?
    let collectionArtistID: Int?
    let collectionArtistViewURL: String?

    enum CodingKeys: String, CodingKey {
        case wrapperType
        case artistID = "artistId"
        case collectionID = "collectionId"
        case amgArtistID = "amgArtistId"
        case artistName, collectionName, collectionCensoredName
        case artistViewURL = "artistViewUrl"
        case collectionViewURL = "collectionViewUrl"
        case artworkUrl60, artworkUrl100, collectionPrice, collectionExplicitness, trackCount, copyright, country, currency, releaseDate, primaryGenreName
        case previewURL = "previewUrl"
        case description, kind
        case trackID = "trackId"
        case trackName, trackCensoredName
        case trackViewURL = "trackViewUrl"
        case artworkUrl30, trackPrice, trackExplicitness, discCount, discNumber, trackNumber, trackTimeMillis, isStreamable, contentAdvisoryRating, shortDescription, longDescription, collectionArtistName
        case collectionArtistID = "collectionArtistId"
        case collectionArtistViewURL = "collectionArtistViewUrl"
    }
}

enum Explicitness: String, Codable {
    case explicit = "explicit"
    case notExplicit = "notExplicit"
}

enum Country: String, Codable {
    case usa = "USA"
}

enum Currency: String, Codable {
    case usd = "USD"
}

enum Kind: String, Codable {
    case song = "song"
    case tvEpisode = "tv-episode"
}

enum WrapperType: String, Codable {
    case audiobook = "audiobook"
    case track = "track"
}