[iOS] Alamofire를 활용해서 OpenAPI 받기

PM077·2022년 11월 23일
0

iOS

목록 보기
6/21

개요

공공데이터포털에서 OpenAPI를 받아 예방접종센터를 알아 볼 수 있는 간단한 어플리케이션을 만들어 보겠습니다. 사진을 보시면 피해야할 곳을 누르면 랜덤으로 OpenAPI에서 받아온 데이터 정보를 출력하는 어플리케이션 입니다.
(본인이 백신맞고 응급실을 가서 안맞겠다는 어플리케이션을 만들었으나 맞는건 본인의 자유며 재미로 봐주셨으면 합니다.)

목차

  1. Cocoapods 및 Alamofire 설치 (간략)
  2. Postman 사용으로 확인 (간략)
  3. ResponseFile 만들기
  4. RequestFile 만들기
  5. Main 파일 UI제작 후 연결 시키기

1. Cocoapods 및 Alamofire 설치

Cocoapods 설치
Alamofire 설치

상세히 설명해주시는 곳이 많으니 구글링을 통해 그대로 설치해주면 별 문제 없이 설치가 가능하다.

2. Postman 사용으로 확인

Postman은 API를 활용한 데이터들이 사용자에 의한 요청으로 인해 응답이 잘 오는지 손쉽게 확인 할 수 있는 어플리케이션이라고 보면 된다
Postman 설치

위의 사진과 같이 해당 주소와 params를 넣어주면 JSON형태로 데이터가 넘어오는 것을 확인 할 수 있다.

3. ResponseFile 만들기

iOS에서는 JSON파일을 받을 때 이 자료들을 사용하려면 Swift 코드로 바꿔주는 것이 중요하다. 위의 사진에서 Postman이 출력해준 값들을 복사해서 quicktype에 붙여넣기를 해주면 Swift코드로 변경해준다.
quicktype 링크
그러면

// 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 requestFile = try? newJSONDecoder().decode(RequestFile.self, from: jsonData)

import Foundation

// MARK: - RequestFile
struct ResponseFile: Codable {
    let currentCount: Int?
    let data: [Datum]?
    let matchCount: Int?
    let page: Int?
    let perPage: Int?
    let totalCount: Int?

    enum CodingKeys: String, CodingKey {
        case currentCount
        case data
        case matchCount
        case page
        case perPage
        case totalCount
    }
}

// MARK: - Datum
struct Datum: Codable {
    let address: String?
    let centerName: String?
    let centerType: CenterType?
    let createdAt: String?
    let facilityName: String?
    let id: Int?
    let lat: String?
    let lng: String?
    let org: String?
    let phoneNumber: String?
    let sido: String?
    let sigungu: String?
    let updatedAt: String?
    let zipCode: String?

    enum CodingKeys: String, CodingKey {
        case address
        case centerName
        case centerType
        case createdAt
        case facilityName
        case id
        case lat
        case lng
        case org
        case phoneNumber
        case sido
        case sigungu
        case updatedAt
        case zipCode
    }
}

enum CenterType: String, Codable {
    case 중앙권역 = "중앙/권역"
    case 지역 = "지역"
}

이와 같이 코드를 직접 생성해준다. 이 코드를 복사해서 Xcode에 따로 .swift파일을 만들어서 저장해둔다. 이를 통해서 데이터가 들어오게끔 틀을 만들어 놓는 것이다.

4. RequestFile 만들기

OpenAPI를 요청할 코드를 작성해줘야 한다. 이때 따로 .swift파일을 만들어 관리해주는 것이 편하기에 만들어보겠다

import Alamofire
import UIKit

class RequestFile{
    func getRequestData(_ viewController: ViewController){
        let url = "https://api.odcloud.kr/api/15077586/v1/centers?page=1&perPage=100&serviceKey=~" //발급받은 키 추가
        let params: Parameters = [
            "page" : 1,
            "perPage" : 100,
            "serviceKey" : "~"//발급받은 키
        ]
        
        //HTTP Method GET
        AF.request(url,
                   method: .get,
                   parameters: params,
                   headers: nil)
        .responseDecodable(of: ResponseFile.self) {response in
            
            switch response.result{
            case .success(let response):
                print("DEBUG>> OpenWeather Response \(response)")
                viewController.didSuccess(response)
                
            case .failure(let error):
                print("DEBUG>> OpenWeather Get Error : \(error.localizedDescription)")
            }
        }
    }
}

위에 코드를 하나씩 보겠다
1. let url, params는 따로 보기편하게 저장해두는 것이다
2. AF.request부터 보자면 Alamofire를 활용해서 요청하는 것을 뜻한다
3. 그렇기에 그에 맞는 형식인 (url, method, parameters, headers)를 지정해주고 response를 받으면 된다
4. 이 때 아래에서 switch-case문으로 만약 데이터를 받는데 성공 시 didSuccess를 호출하고(5번에서 알아볼 것 입니다), 실패 시 로그창에 error가 나왔다고 print 할 것이다.

그럼 요청은 완료되었으니 요청이 성공할 때(didSuccess)어떻게 되야할지 보겠다.

5. Main 파일 UI제작 후 연결 시키기

import UIKit
import Alamofire

class ViewController: UIViewController {

    @IBOutlet weak var centerName: UILabel!
    @IBOutlet weak var address: UILabel!
    @IBOutlet weak var facilityName: UILabel!
    @IBOutlet weak var phoneNumber: UILabel!
    
    @IBOutlet weak var mainView: UIStackView!
    
    @IBAction func pressDodge(_ sender: Any) {
        
        RequestFile().getRequestData(self)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        mainView.layer.borderColor = UIColor.black.cgColor
        mainView.layer.borderWidth = 2
        
    }
}

extension ViewController{
    func didSuccess(_ response: ResponseFile){
        let a = Int.random(in: 0...99)
        
        let getCenterName = response.data?[a].centerName
        self.centerName.text = getCenterName
        let getAddress = response.data?[a].address
        self.address.text = getAddress
        let getFacilityName = response.data?[a].facilityName
        self.facilityName.text = getFacilityName
        let getPhoneNumber = response.data?[a].phoneNumber
        self.phoneNumber.text = getPhoneNumber
        
    }
}

먼저 전체 코드를 복붙했지만 아래 extension으로 따로 빼놓은 부분, 그리고 버튼 클릭 시 발생하는 부분만 보면 된다.

    @IBAction func pressDodge(_ sender: Any) {
        
        RequestFile().getRequestData(self)
    }

부분을 보면 버튼을 클릭 시 request를 한다. 이는 4번의 requestfile()의 func를 불러오는 형태이다. 이를 통해 데이터를 요청하는 것이다. 이후,

extension ViewController{
    func didSuccess(_ response: ResponseFile){
        let a = Int.random(in: 0...99)
        
        let getCenterName = response.data?[a].centerName
        self.centerName.text = getCenterName
        let getAddress = response.data?[a].address
        self.address.text = getAddress
        let getFacilityName = response.data?[a].facilityName
        self.facilityName.text = getFacilityName
        let getPhoneNumber = response.data?[a].phoneNumber
        self.phoneNumber.text = getPhoneNumber
        
    }
}

4번에서 말한 didSuccess문이 여기에 있다. 즉, 성공하게 된다면 didSuccess가 실행될 것이고, error면 4번에서 말했다시피 error 로그를 출력할 것이다. didSuccess문을 보면 ResponseFile에 맞게 데이터를 가져다 쓰는 것을 볼 수 있다. 그 형식에 맞게 출력해주면 text값을 받을 수 있는 것이다.

Etc

사용한 OpenAPI

공공데이터활용지원센터_코로나19 예방접종센터 조회서비스

Git

https://github.com/chad0909/UMCWeek9Assignment_Alamofire

profile
PM/PO

0개의 댓글