개발/Swift

[Swift] API 네트워킹 , Json 파싱 하는법

덤벨로퍼 2020. 11. 3. 18:55

openweathermap.org/

실시간 날씨 데이터를 가져오는 간단한 예제이다.

 

API 네트워킹 하기

 

다음은 기본 url 이다.

"http://api.openweathermap.org/data/2.5/weather?units=metric&appid=3a395c05bd9d58055e42048436e96166"

units 는 metric 단위로하고 (기본값으로 할경우 온도가 179 이렇게 나오므로 이해가 안감)

appid 는 나의 APIKEY 이다. 회원가입하면 APIKEY 를 받을수있다.

이제 여기에 검색할때 마다 지역명을 쿼리 파라미터에 넣어줄거다.

class WeatherManager {
    let weatherURL = "http://api.openweathermap.org/data/2.5/weather?units=metric&appid=3a395c05bd9d58055e42048436e96166"
    
    func fetchWeatherData(cityName : String){
       let url = "\(weatherURL)&q=\(cityName)"
        performRequest(urlString: url)
    }
 }

검색 버튼을 클릭할시 fetchWeatherData(지역명) 이 실행 될것이다.

검색창에 넣어둔 text 를 가져와 기존 url 에 덧붙여 네트워킹을 실시 할것이다.

 func performRequest(urlString : String) {
    //URL생성
    if let url = URL(string: urlString){
        //URLSession 생성
        let session = URLSession(configuration: .default)
                   //session에게 작업 전달           //작업결과 다룰 메소드
        let task = session.dataTask(with: url, completionHandler: handle(data:response:error:))
        //작업시작
        task.resume()
    }
        
  }
    

첫번째로 URL을 생성해준다. URL 은 해당 코드파일에 Foundation 이 import 되어있어야한다.

url 생성에 실패할 경우를 대비해 if let 을 사용했다.

import Foundation

session은 기본값으로 만들어주고

작업을 정의 하기위해 session.dataTask메소드를 사용한다.

이때 첫번째에만든 url 을 사용하였고 

completionHandler 에 작업 결과물을 다룰 메소드를 지시해주는데 이때 data, response, error 파라미터가 들어간다.

이제 이때 사용할 메소드를 만들어보자

 

func handle(data: Data?, response: URLResponse?, error:Error?) {
        if error != nil {
            print(error!)
            return
        }
        if let safeData = data {
            let dataString = String(data: safeData, encoding: .utf8)
            print(dataString!)
        }
    }

우선 간단히 데이터가 잘 전달되는지 print 해보도록한다.

error 발생을 대비해 먼저 처리해주고

이후에 data 를 받아와 String 으로 타입 변환했다.

 

실행결과 이런 에러가 발생했다.

The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

해당 에러는 간단히 기본 url이 https 가 아닌 http 였기 때문이라

https 로 바꿔주면 된다.

이렇게 받은 데이터를 가져와 이제 원하는 데이터를 뽑아 parsing 할것이다.

 

JSON 다루기

 

우선 WeatherData.swift 파일을 생성한뒤 모델을 생성한다.

struct WeatherData : Decodable {
    let name : String
    let main : Main
}


struct Main : Decodable{
    let temp : Double
}

 필요한것은 name / temp 두개만 있다 가정하고

temp 는 main 안에 있으므로 main struct 를 따로 만들었다.

다시 WeatherManager.swift 로 돌아와 parsing 메소드를 만든다.

func parseJSON(weatherData :Data){
        let decoder = JSONDecoder()
        do{
            let decodedData = try decoder.decode(WeatherData.self, from: weatherData)
            print(decodedData.name)
            print(decodedData.main.temp)
        }catch{
            print(error)
        }
        
    }

JSONDecoder()를 생성한후 

decode() 메소드를 사용하는데 이때 첫번째 파라미터는 변환할 타입, 두번쨰는 변환할 데이터를 넣어준다.

에러가 발생할수있으니 try/catch 에 넣어주면 된다.