SwiftUI: API 사용법

soobee·2023년 12월 9일

1. api를 호출할 사이트에서 개인키를 발급받는다.

2. key를 저장할 .plist 파일을 만들고 저장한다.


3. 호출할 json 자료형을 확인한다.

나는 제주도 주차장 api를 사용했다.
https://api.odcloud.kr/api/15050093/v1/uddi:d19c8e21-4445-43fe-b2a6-865dff832e08?page=1&perPage=600&cond%5B%EC%A7%80%EC%97%AD%EC%BD%94%EB%93%9C%3A%3AEQ%5D=50110&serviceKey=\(apiKey)

여기 apiKey 자리에 키를 넣고 검색해보면

다음과 같이 뜬다. 나는 크롬의 jsonViewer 확장프로그램을 이용했다.

4. 받을 모델의 구조체를 만들어준다.

여기서 필요없는 데이터는 변수로 선언하지 않아도 된다.

5. 디코딩할 코드를 짜준다.

  • 여기서 디코딩: JSON 문자열을 UTF-8 형식으로 디코딩하여 읽을 수 있는 문자열로 변환
  • 파싱: JSON 문자열을 객체로 변환하고, 특정 필드(예: 위치, 화장실의 개수)를 추출합니다.
class NewsAPI: ObservableObject {
    
    static let shared = NewsAPI()
    private init() { }
    
    @Published var posts = [ParkingItem]()
    
    private var apikey: String? {
        get {
            let keyfilename = "ApiKeys"
            let api_key = "Parking_API_KEY"
            
            // 생성한 .plish 파일 경로 불러오기
            guard let filePath = Bundle.main.path(forResource: keyfilename, ofType: "plist") else {
                fatalError("Couldn't find file '\(keyfilename).plist")
            }
            
            // .plist 파일 내용을 딕셔너리로 받아오기
            let plist = NSDictionary(contentsOfFile: filePath)
            
            // 딕셔너리에서 키 찾기
            guard let value = plist?.object(forKey: api_key) as? String else {
                fatalError("Couldn't find key '\(api_key)'")
            }
            return value
        }
    }
    
    // 디코딩하는 부분
    func feachData() {
        guard let apiKey = apikey else { return }
        
        print("apiKey: \(apiKey)")
        
        let urlString =
        "https://api.odcloud.kr/api/15050093/v1/uddi:d19c8e21-4445-43fe-b2a6-865dff832e08?page=1&perPage=600&cond%5B%EC%A7%80%EC%97%AD%EC%BD%94%EB%93%9C%3A%3AEQ%5D=50110&serviceKey=\(apiKey)"
        
        guard let url = URL(string: urlString) else { return }
        
        let session = URLSession(configuration: .default)
        
        
        // dataTask() 메서드의 with: 매개변수에 url 또는 request 객체를 가지고 통신
        let task = session.dataTask(with: url){ data, response, error in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            
            guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
                // 정상적으로 값이 오지 않았을 때 처리
                return
            }
            
            guard let data = data else {
                print("No data received")
                return
            }
            
            
            //여기서 디코딩 함
            do {
                let json = try JSONDecoder().decode(Results.self, from: data)
                
                DispatchQueue.main.async {
                    self.posts = json.data
                }
                
            } catch let error {
                print(error)
            }
        }
        task.resume()
    }
}

6. 메인뷰 구성

7. 결과

profile
까먹지않기..저장저장.📝

0개의 댓글