ios

Alamofire 간단하게 사용하기

aircook 2020. 4. 24. 21:10

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을 통하여 진행해야 겠습니다.