본문 바로가기

ios

Alamofire 간단하게 사용하기

Rest API를 호출하기 위해 가장 유명한 Swift 라이브러리인 Alamofire를 사용해보겠습니다.
Alamofire에 대한 정보는 다음 주소에서 확인할 수 있습니다.
https://github.com/Alamofire/Alamofire

 

Alamofire/Alamofire

Elegant HTTP Networking in Swift. Contribute to Alamofire/Alamofire development by creating an account on GitHub.

github.com

우선 CocoaPods를 이용하여 설치를 진행하겠습니다.

테스트에 사용할 API를 curl을 통해 다음과 같이 확인하였습니다.

이제 확인한 API를 Alamofire를 통해 사용해보겠습니다.

//
//  RestViewController.swift
//  Sample
//
//  Created by francis on 2020/04/24.
//  Copyright © 2020 Aircook. All rights reserved.
//

import UIKit
import Alamofire

class RestViewController: UIViewController {

    @IBOutlet weak var resultTextView: UITextView!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        self.resultTextView.text = ""
        self.resultTextView.textContainerInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15);
        
        //let headers: HTTPHeaders = [
        //    "Authorization": "Basic VXNlcm5hbWU6UGFzc3dvcmQ=",
        //    "Accept": "application/json"
        //]
        
        //let headers: HTTPHeaders = [
        //    .authorization("Basic VXNlcm5hbWU6UGFzc3dvcmQ="),
        //    .accept("application/json")
        //]
        
        Logger.debug("view did load")
        
        //https://swapi.dev/api/films
        guard let url = URL(string: "https://httpbin.org/get") else {
          return
        }
        
        AF.request(url,
                   method: .get,
                   parameters: ["args1": "value1"],
                   interceptor: Interceptor(indicator: activityIndicator))
        .validate()
        .responseJSON(completionHandler: { res in
            
            var result: String = "";
            
            switch res.result {
            case .success(let data):
                if let jsonObject = data as? [String: Any] {
                    if let origin = jsonObject["origin"] {
                        Logger.debug("origin is \(origin)")
                        
                        result += "origin: \n"
                        result += "\(origin as! String) \n"
                    }
                    if let headers = jsonObject["headers"] as? [String: String] {
                        //Logger.debug("headers is \(headers)")
                        if let host = headers["Host"], let userAgent = headers["User-Agent"] {
                            Logger.debug("host is \(host), userAgent is \(userAgent)")
                            
                            result += "host: \n"
                            result += "\(host) \n"
                            result += "userAgent: \n"
                            result += "\(userAgent) \n"
                        }
                    }
                    
                    self.resultTextView.text = result
                    
                }
            case .failure(let err):
                Logger.debug("error is \(String(describing: err))")
            }
            
            self.activityIndicator.stopAnimating()
            self.activityIndicator.isHidden = true
        })
    }
}

// 이렇게 해봤는데 되네..
class Interceptor: RequestInterceptor {
    
    private let indicator: UIActivityIndicatorView
    
    init(indicator: UIActivityIndicatorView){
        self.indicator = indicator
    }
    
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        
        Logger.debug("interceptor adapt..")
        
        DispatchQueue.main.async {
            self.indicator.startAnimating()
            self.indicator.isHidden = false
        }
        
        completion(.success(urlRequest))
    }
}

다음과 같이 콘솔창에서 결과를 확인할 있습니다.

다음에는 JSON 변환을 SwiftyJSON을 통하여 진행해야 겠습니다.

'ios' 카테고리의 다른 글

Kakao Maps API with Swift  (7) 2020.08.21
Xcode 에서 GitLab 연동하기  (0) 2020.04.22
위치서비스를 위한 권한 상태값 가져오기  (0) 2020.04.20
Location updates in Background Modes  (0) 2020.04.19
Migration in Realm  (0) 2020.04.18