이전 포스트에서는 Almaofire 설치, Request, HTTP Method에 대해 정리했는데 이번엔 Response와 Validate에 대해 알아보려고 한다.
앞서 Request
를 했으면 당연히 그에 따른 response
가 있을 것 이다.
Alamofire에서는 requese
뒤에 response
를 붙여주면 된다.
AF.request(url).response()
위 코드를 실행하면 아래와 같은 값을 확인 할 수 있다.
즉, www.naver.com
서버에 request
하면 그에 대한 response
로 success
가 넘어왔다.
그럼, response
에는 한 방법만 있나? 아니다. Alamofire에는 6가지의 response handler
가 있다.
참고로 response handler
는 서버에서 반환되는 유효성 검사를 하지는 않는다. 이 부분은 Response Validation
에서 짚어보려고 한다.
response
HandlerURLSessionDelegate
에서 직접 모든 정보를 전달하고 응답 데이터를 평가하지 않는다.URLSessionDelegate : URLSession 인스턴스가 세션 수준의 이벤트를 처리하기 위해 Delegate에서 호출하는 메서드를 정의하는 프로토콜
아래와 같이 사용한다.
AF.request(url).response { response in
print(response)
}
responseData
HandlerDataResponseSerializer
를 사용해 서버에서 반환된 데이터를 추출하고 유효성 검사를 진행한다.
- DataResponseSerializer : 최소 응답 검사를 수행하고 모든 응답 데이터를 그대로 반환하는 ResponseSerializer다.
- ResponseSerializer : 응답을 모두 처리 할 수있는 직렬 변환기다.
AF.request(url).responseData { response in
print(response)
}
responseString
HandlerStringResponseSerializer
를 사용해 서버에서 반환된 데이터를 지정된 인코딩을 사용하는 문자열로 변환한다. 만약, 인코딩이 지정되지 않은 경우 Alamofire는 서버의 HTTPURLResponse
에 지정된 텍스트 인코딩을 사용한다.StringResponseSerializer : 응답 데이터를 문자열로 디코딩하는 ResponseSerializer.
AF.request(url).resonseString { response in
print(response)
}
responseJSON
HandlerJSONResponseSerializer
를 사용해 서버에서 반환된 데이터를 지정된 JSONSerialization.ReadingOptions
를 사용하는 Any
타입으로 변환한다.
- JSONResponseSerializer : JSONSerialization을 사용하여 응답 데이터를 디코딩하는 ResponseSerializer.
- JSONSerialization.ReadingOptions : JSON 데이터에서 Foundation 개체를 만들 때 사용되는 옵션
responseDecodable
HandlerDecodableResponseSerializer
를 사용해 서버에서 반환된 데이터를 지정된 DataDecoder
을 사용하는 Decodable
타입으로 변환한다.
- DecodableResponseSerializer : DataDecoder를 따르는 모든 타입을 사용해 응답 데이터를 제네릭 값으로 디코딩하는 ResponseSerializer.
- DataDecoder : 데이터를 Decodable타입으로 디코딩 할 수 있는 모든 타입.
앞서서는 6가지라고했던게 5가지만 소개된 이유는 response
Handler가 2가지 방식으로 사용되기 때문이다.
유효성검사는 요청에 대한 response
를 하기 전에 .validate()
를 호출함으로써 유효하지 않은 상태 코드나 MIME
타입이 있는 경우 response
하지 않도록 한다.
일반적인 사용 방법은 아래와 같고
AF.request(url)
.validate()
.response { response in
print(response)
}
상태 코드나 MIME 타입 조건을 넣는 방법은 다음과 같다.
AF.request(url)
.validate(200..<300) // 200~300 사이 상태코드만 허용
.validate(contentType:["application/json"]) // JSON 포맷만 허용
.response { response in
print(response)
}
주석처럼 위 코드는 해당 URL에 대한 응답 처리를 상태코드가 200~300이면서 JSON 포맷일 때 응답처리를 한다.
참고문서