Search
Duplicate

Alamofire란?

Created
2023/08/26 06:53
Tags
Library
태그

Alamofire 란?

iOS HTTP 통신을 할 떄 필수 라이브러리인 Alamofire 에 대한 정리!
Alamofire 란 iOS, macOS를 위한 스위프트 기반 HTTP 네트워킹 라이브러리로 Apple의 Foundation Networking 기반으로 인터페이스를 제공하여 일반적인 네트워킹 작업을 단순화한다.
Alamofire 는 함께 사용 가능한(Chainable) Request/Response 메소드들, JSON 파라미터, 응답 직렬화(Response Serialization), 인증(Authentication) 그리고 많은 다른 기능을 제공한다.
연결가능한(Chainable) Request/Response 메서드
URL/JSON/plist 파라미터 인코딩
파일/데이터/스트림/멀티파트 폼 데이터 업로드
NSURLCredential을 통한 인증(Authentication)
HTTP Response 검증(Validation)
TLS 인증서와 공개키 Pinning
진행 상태 클로저와 NSProgress
cURL 디버깅 출력
광범위한 단위 테스트 보장
완벽한 문서화

 요약

Alamofire란, iOS, macOS를 위한 Swift 기반의 HTTP 네트워킹 라이브러리
Alamofire는 URLSession 기반이며 URLSession은 네트워킹 호출에서 모호한 부분이 많은데, Alamofire를 사용한다면 데이터를 접근하기 위한 노력을 줄일 수 있으며 코드를 더 깔끔하고 가독성 있게 쓰는 것이 가능해진다.
Alamofire는 HTTP 네트워킹을 하는데 자주 사용하게 되는 코드나 함수를 더 쉽게 사용할 수 있도록 모아놓은 것
iOS에서 기본적으로 제공하고 있는 HTTP 통신 방법은 여러가지가 있지만 URLSession 을 이용한 방법이 있다.
모두가 같은 방법으로 사용하진 않겠지만 기본적으로 이러한 형태로 요청이 가능하다.
var request = URLRequest(url: URL(string: "http://api.github.com/users")!) request.httpMethod = "GET" URLSession.shared.dataTask(with: request) { (data, response, error) in }
Swift
복사
만약 여기서 Get 요쳥이 POST 요청으로 바뀐다고 한다면, 아래와 같은 파라미터를 넘길 수 있다.
var request = URLRequest(url: URL(string: "https://api.github.com/users")!) request.httpMethod = "POST" let params = ["id": id, "password": password] as Dictionary do { try request.httpBody = JSONSerialization.data(withJSONObject: params, options: []) } catch { return } URLSession.shared.dataTask(with: request) { (data, response, error) in }
Swift
복사
만약 여기서 Header를 추가하게 된다면 아래를 추가해주어야 한다.
request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept")
Swift
복사
이렇게 성공, 실패를 또 나누어야 한다.
var request = URLRequest(url: URL(string: "https://api.github.com/users")!) request.httpMethod = "POST" let params = ["id": id, "password": password] as Dictionary do { try request.httpBody = JSONSerialization.data(withJSONObject: params, options: []) } catch { return } request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in if let response = response as? HTTPURLResponse, 200...299 ~= response.statusCode { // SUCCESS } else { // Failure } })
Swift
복사
이런 식의 코드는 가독성은 물론이며, 조금의 설정만 바꾸면 많은 것이 변경되어야 해서 여러모로 불편한 점이 있다.
그래서 이러한 불편한 것들을 개선시키는 라이브러리인 Alamofire 를 사용해보자

 Alamofire는 Swift로 작성된 HTTP 네트워킹 라이브러리

설치 → CocoaPods
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '10.0' use_frameworks! target '<Your Target Name>' do pod 'Alamofire', '~> 4.4' end
Ruby
복사

 URL 요청

Alamofire.request("https://api.github.com/users", method: .get, parameters: [:], encoding: URLEncoding.default, headers: ["Content-Type": "application/json", "Accept": "application/json"]) .validate(statusCode: 200..<300) .responseJSON { (response) in if let JSON = response.result.value { print(JSON) } }
Swift
복사

 request 메소드의 변수들

request( _url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil )
Swift
복사
url : 요청할 URL
method : 요청 형식 (get, post, put, delete 등)
parameters : 요청 시 같이 보낼 파라미터
encoding : encoding
header : [String: String] 형태로 보낼 수 있음
위에서 일일이 추가 하던 것과는 다르게 확연히 다른 차이를 볼 수 있으며, 훨씬 간결해서 보기도 편하다.
뿐만 아니라, request가 성공인지 실패인지를 필터를 하는 validate(status: 200..<300)로 200~299 사이의 statusCode 결과만 받아올 수 있는 간편한 기능도 지원한다.

 사용

 Request 만들기

import Alamofire Alamofire.request(.GET, "https://httpbin.org/get") Alamofire.request(.GET, "https://httpbin.org.get", parameters: ["foo": "bar"]) .responseJSON { response in print(response.request) // original URL request print(response.response) // URL response print(response.data) // server data print(response.result) // result of response serialization if let JSON = response.result.value { print("JSON: \(JSON)") } }
Swift
복사
Alamofire 은 비동기(Asynchronously)로 네트워크 연동을 하기 때문에 서버로부터 응답을 받을 때까지 기다리지 않고 콜백을 통해서 응답을 처리해준다.
위의 예시처럼 요청에 대한 응답은 이를 처리하는 핸들러 안에서만 유효하므로 수신한 응답이나 데이터에 의존적인 동작들은 반드시 해당 핸들러 내에서 완료 해야한다.

 Response 처리

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) .response { request, response, data, error in print(request) print(response) print(data) print(error) }
Swift
복사
Response Serialization은 수신한 데이터에 별도의 처리를 하지 않고, URL Session 델리게이트로부터 수신한 모든 정보를 그대로 전달할 뿐이다.
Response나 Result 자료형의 장점을 활용할 수 있도록 다른 Serialization을 활용하기를 권장!
Alamofire는 Request 뿐만 아니라 Upload, Download 등 여러가지를 지원하며, 그에 맞는 기능을 최대한 편하게, 간결하게 사용할 수 있도록 제공한다.

 Reference