-
[iOS] Alamofire를 이용한 공공데이터 API 이용iOS 2022. 11. 26. 14:39
https://org9899.tistory.com/86
[iOS] 9주차 세미나 정리
[Network] 저녁을 먹을시간이 되었다고 가정했을때, 오늘 저녁 뭐먹을지 생각할것이다! 혼자생각할땐 대화를 하지않으니, 이런 상황에서는 어떻게 생각하고 말을 하던 아무런 상관이없다. --- 혼자
org9899.tistory.com
위 9주차 세미나에서는 URLSession을 이용해 데이터 통신을 진행해보았지만, 이번 미션으로는 Alamofire을 이용해서 공공데이터 API를 활용해보았다.
순서대로 정리해보자면, 우선 처음에는 공공데이터 API 활용신청을 해준다! 활용신청을 해주어야 해당 serviceKey값을 받을 수 있기때문에 신청해주어야한다!
https://www.data.go.kr/data/15097236/openapi.do
경상북도 구미시_버스 노선
경상북도 구미시 버스 노선에 대한 데이터로 노선 번호, 노선 형태, 노선 유형, 배차 간격, 노선 총길이, 운행 개시일, 운행 종료일 등의 데이터를 제공합니다.
www.data.go.kr
1. 활용신청하기 (구미시_버스 노선을 이용해볼것이다!)
2. Postman 이용해서 JSON 파일로 변환
필수로 적어줘야하는부분만 KEY값을 넣어준다! (인증키, 페이지 번호, 한 페이지 결과 수)
3. JSON 포멧을 Swift로 변환해주기
Instantly parse JSON in any language | quicktype
app.quicktype.io
4. 변환해준 Swift 코드를 DataModel에 입력해준다!
Encodable형식으로 되어있다면, 다 Decodable로 바꿔주어야하지만, Codable형식으로 되어있다면 따로 바꿔줄필요없다!
// This file was generated from JSON Schema using quicktype, do not modify it directly. // To parse the JSON, add this file to your project and do: // // let dataModel = try? newJSONDecoder().decode(DataModel.self, from: jsonData) import Foundation // MARK: - DataModel struct DataModel: Codable { let body: [Body] let header: Header } // MARK: - Body struct Body: Codable { let routeStdIdntfc: Int let routeNo: String let routeStle, routeSE, routeTy, cdpntIdntfr: Int let tmnlIdntfr, pktmCaralcIntrvl, nonPktmCaralcIntrvl: Int let routeLt: Double let routeReformNo, routeStuatnReformNo: String let cmptofc: Cmptofc let opratBgnde, opratEndde, routeNm: String enum CodingKeys: String, CodingKey { case routeStdIdntfc = "route_std_idntfc" case routeNo = "route_no" case routeStle = "route_stle" case routeSE = "route_se" case routeTy = "route_ty" case cdpntIdntfr = "cdpnt_idntfr" case tmnlIdntfr = "tmnl_idntfr" case pktmCaralcIntrvl = "pktm_caralc_intrvl" case nonPktmCaralcIntrvl = "non_pktm_caralc_intrvl" case routeLt = "route_lt" case routeReformNo = "route_reform_no" case routeStuatnReformNo = "route_stuatn_reform_no" case cmptofc case opratBgnde = "oprat_bgnde" case opratEndde = "oprat_endde" case routeNm = "route_nm" } } enum Cmptofc: String, Codable { case 구미시 = "구미시" } // MARK: - Header struct Header: Codable { let pageNo: Int let resultCode: String let totalCount, numOfRows: Int let resultMsg: String }
5. Alamofire 사용하기!
- Alamofire를 사용할때, 아래 GitHub를 참고해서 해도되나, xcode에서 바로 추가할수도있다!
https://github.com/Alamofire/Alamofire
GitHub - Alamofire/Alamofire: Elegant HTTP Networking in Swift
Elegant HTTP Networking in Swift. Contribute to Alamofire/Alamofire development by creating an account on GitHub.
github.com
해당 폴더를 클릭하고, Package Dependencies에 들어가서 하단에 플러스 버튼을 눌러준다.
위 사진처럼 해당 GiHub주소를 검색창에 넣어주고 Add Package를 눌러주면된다!
: 사용시에 ViewController에 import해주면 바로 사용가능하다!
import Alamofire // import
6. ViewController 작성
iOS : Alamofire 를 이용한 API 호출
2020-09-04 > Alamofire ? 서버 통신을 도와주는 Swift 라이브러리. 라이브러리 설치방법 git clone 을 이용하는 방법과 cocoa pods 을 이용하는 방법이 있다. git clone 을 사용하는 방법 Xcode 메뉴에 source
velog.io
해당 블로그를 참고해서 코드를 작성해보았을때, 아래 코드대로 한다면 2가지 오류가 뜨는것을 알 수 있다.
// // ViewController.swift // standard9 // // Created by 김민경 on 2022/11/25. // import UIKit import Alamofire // import class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let url = URL(string: "http://apis.data.go.kr/5080000/busRouteService/getBusRoute")! let serviceKey = "YzTWkyxlVuAOFiFsqXRd9w%2BmByrgrDFBVIeTzWCu92kbojMchGHMfuXb%2BQlxE1et%2BpI45vHTBBMJQ7GetYqFig%3D%3D" let parameter = [ "serviceKey" : serviceKey, "pageNo" : "1", "numOfRows" : "10", ] AF.request(url, method: .get, parameters: parameter, encoding: URLEncoding.default).responseDecodable(of: DataModel.self) {response in switch response.result { case .success(let value) : print(value) case .failure(let error) : print(error) } } } } // 오류 2개 : Decoding error, 보안 error
아래 오류 코드를 보면 2가지 Error가 뜨는것을 알 수 있는데, 한가지는 보안 error로 이미 경험을 해봐서 금방 고칠 수 있었다!
오류1) 보안 error
접근 허용문제 때문에 보안 error가 생기는것인데, 아래 블로그를 참고하여
https://doqtqu.tistory.com/107
[iOS] App HTTP 접근 허용하기
ATS(App Transport Sercurity)는 iOS 9 버전 이후부터 적용된 보안 정책으로, 보안에 취약한 네트워크를 차단시킨다.따라서 HTTP 접근 시 Console 창에 다음과 같은 에러가 발생하며 안내사항과 같이 Info.plist
doqtqu.tistory.com
위처럼 추가해준다면, 해당 에러는 사러지는것을 볼 수 있다!
오류2) Decoding error
두번째 에러는 Decoding error이다. 에러 코드를 일부만 복사해, 구글링 해보면 해당 부분에 오류가 났었다는것을 알 수 있다.
이 부분만 복사를 해주었다! (전체 복사하면 안나오더라그요,,,!)
Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.
let parameter = [ "serviceKey" : serviceKey, "pageNo" : "1", "numOfRows" : "10", ]
아래 블로그를 참고해서 수정을 했고,
https://zeddios.tistory.com/798
iOS ) DecodingError
안녕하세요 :) Zedd입니다.날씨가 정말 선선해져따.....세상의 모든 비염 분들..이겨냅시다.................... 암튼 오늘은 DecodingError를 공부해보려고 합니다. DecodingError가 모냐면..말그대로 Decoding할
zeddios.tistory.com
let parameter = [ "serviceKey" : serviceKey, "pageNo" : "1", "numOfRows" : "10" ]
위와 같이 변경해준다면 에러코드가 또 나올것이다,,,,오래 찾았는데,,,
아래 코드처럼 .removingPercentEncoding을 붙여주지않으면 계속 저 dataCorrupted오류가 나온다!
let url = URL(string: "http://apis.data.go.kr/5080000/busRouteService/getBusRoute")! let serviceKey = "YzTWkyxlVuAOFiFsqXRd9w%2BmByrgrDFBVIeTzWCu92kbojMchGHMfuXb%2BQlxE1et%2BpI45vHTBBMJQ7GetYqFig%3D%3D".removingPercentEncoding let parameter = [ "serviceKey" : serviceKey, "pageNo" : "1", "numberOfRows" : "10" ]
이렇게 수정을 다 완료해서 최종 코드를 입력하면!
import UIKit import Alamofire class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let url = URL(string: "http://apis.data.go.kr/5080000/busRouteService/getBusRoute")! let serviceKey = "YzTWkyxlVuAOFiFsqXRd9w%2BmByrgrDFBVIeTzWCu92kbojMchGHMfuXb%2BQlxE1et%2BpI45vHTBBMJQ7GetYqFig%3D%3D".removingPercentEncoding let parameter = [ "serviceKey" : serviceKey, "pageNo" : "1", "numberOfRows" : "10" ] AF.request(url, method: .get, parameters: parameter) .responseDecodable(of: DataModel.self) { response in switch response.result { case .success(let value): print(value.body) case .failure(let error): print(error) } } } }
아래와 같이 데이터가 뜨는것을 확인할 수 있다!!
'iOS' 카테고리의 다른 글
[iOS] KakaoSocial 로그인 구현 (0) 2022.11.28 [iOS] 10주차 세미나 정리 (2) 2022.11.28 [iOS] 9주차 세미나 정리 (0) 2022.11.23 [iOS] UI animate 이용해서 navigation bar 숨기기 (0) 2022.11.18 [iOS] Tap Gesture 이용해서 Keyboard 숨기기 (0) 2022.11.17