ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] API 네트워킹 , Json 파싱 하는법
    개발/Swift 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 에 넣어주면 된다.

     

    댓글

Designed by Tistory.