-
[Swift] API 네트워킹 , Json 파싱 하는법개발/Swift 2020. 11. 3. 18:55
실시간 날씨 데이터를 가져오는 간단한 예제이다.
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 에 넣어주면 된다.
'개발 > Swift' 카테고리의 다른 글
부모 viewController에서 addSubview 를 통해 뷰를 노출 시키는 방법 (0) 2021.03.22 Storyboard reference 스토리보드 분할하기 (0) 2021.03.12 Swift CollectionView Scroll 이미지로 인한 렉 현상 해결 (0) 2021.02.22 Swift MVVM 패턴 Network -> Decode -> View (0) 2021.01.12 [Swift] Protocol & Delegate (0) 2020.11.04