[Swift] API 네트워킹 , Json 파싱 하는법
실시간 날씨 데이터를 가져오는 간단한 예제이다.
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 에 넣어주면 된다.