Alamofire ์กฐ๊ธ ๋ ์ดํดํ๊ณ ์ฌ์ฉํด๋ณด์
๋ค์ด๊ฐ๊ธฐ ์ ์
Alamofire ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด URLRequest๋ฅผ ์ฌ์ฉ์ ์ ์ํด์ ์ฌ์ฉํ ์ ์๋
URLRequestConvertible์ด๋ผ๋ ํ๋กํ ์ฝ์ด ์๋๋ผ๊ตฌ์?
ํญ์ ๊ธฐ๋ณธ์ ์ธ request ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋
์ฐ๋ฆฌ...
์๋ ๋ ์์ ...
์กฐ๊ธ ๋ ์๋น์ค ์ฝ๋๋ฅผ ์ ์์ฑํด์ ์ฌ์ฉํ ์๋ ์๋์ง ๊ณ ๋ฏผํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
์์ง ๊ฐ ๊ธธ์ด ๋ฉ์ง๋ง ์กฐ๊ธ ๋ ๋ฐฐ์๋ณด์๋ผ๋ ์๊ฐ์ผ๋ก ์ด์ฌํ ํด๋ด์ผ์ฃ ~
๊ธฐ์กด vs ๊ฐ์
๊ธฐ์กด ์๋น์ค ์ฝ๋
- ๊ฐ ์๋น์ค๋ง๋ค ๋งค๋ฒ ๋น์ทํ ์ฝ๋๋ฅผ ์์ฑ์ ํ๊ณ ์์ด ํจ์จ์ฑ์์ ์ข์ง ์์ ๋ณด์ ๋๋ค.
- (์ ๋ง ๊ทธ๋ฌ๋ ๊ฑธ๊น์...ใ ใ ํต์ ์ฝ๋ ์์ฑํ๋ ๊ฑฐ ๋น์ทํด์ ๋งจ๋ ๋ณต๋ถํ๋ค์์ ํ๋ผ๋ฏธํฐ๋ง ๋ฐ๊พธ๋... ^^)
๊ฐ์ ํ ์๋น์ค ์ฝ๋
- ๋ถ๊ธฐ์ฒ๋ฆฌ๋ APIRouter์์ ํ๊ณ ์๊ณ , APIClient์ ์์ฑํ ํจ์ ํ๋๋ง ์ฌ์ฉํด์ ๋คํธ์ํฌ ํต์ ์ ํฉ๋๋ค.
์ฝ๋ - Networks/
APIConstants
- API ํต์ ์ ์ฌ์ฉํ ๋ค์ํ ์์๋ค์ ๋ชจ์๋์ ํ์ผ์ ๋๋ค.
import Foundation
struct APIConstants {
// MARK: - Start Endpoint
static var baseURL: URL {
return URL(string: "http://13.209.82.176:5000")!
}
static let token = ""
}
enum HTTPHeaderField: String {
case authentication = "Authorization"
case contentType = "Content-Type"
case acceptType = "Accept"
case acceptEncoding = "Accept-Encoding"
case xAuthToken = "x-auth-token"
}
enum ContentType: String {
case json = "application/json"
}
APIRouter
- Endpoint๋ฅผ ๊ตฌ๋ถํด์ ์ ๊ณตํ๋ ํ์ผ์ ๋๋ค.
- HTTPMethods, Path, Parameter, Encoding ๋ฐฉ์์ ์ค์ ํ ์ ์์ต๋๋ค.
import Foundation
import Alamofire
enum APIRouter: URLRequestConvertible {
// MARK: - Cases
case getTravels
case addTravel(travelName: String, destination: String, startDate: String, endDate: String, imageIndex: Int)
case getSchedules(groupId: String, date: String)
// MARK: - Methods
var method: HTTPMethod {
switch self {
case .getTravels, .getSchedules:
return .get
case .addTravel:
return .post
}
}
// MARK: - Paths
var path: String {
switch self {
case .getTravels, .addTravel:
return "/travel"
case .getSchedules(let groupId, let date):
return "/schedule/daily/\(groupId)/\(date)"
}
}
// MARK: - Parameters
private var parameters: Parameters? {
switch self {
case .getTravels, .getSchedules:
return nil
case .addTravel(let travelName, let destination, let startDate, let endDate, let imageIndex):
return [
"travelName": travelName,
"destination": destination,
"startDate": startDate,
"endDate": endDate,
"imageIndex": imageIndex
]
}
}
// MARK: - Encodings
var encoding: ParameterEncoding {
switch self {
case .getTravels:
return URLEncoding.default
default:
return JSONEncoding.default
}
}
// MARK: - URL Request
func asURLRequest() throws -> URLRequest {
let url = APIConstants.baseURL.appendingPathComponent(path)
var urlRequest = URLRequest(url: url)
// HTTP Method
urlRequest.method = method
// Common Headers
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue)
urlRequest.setValue(APIConstants.token, forHTTPHeaderField: HTTPHeaderField.xAuthToken.rawValue)
// Parameters
if let parameters = parameters {
return try encoding.encode(urlRequest, with: parameters)
}
return urlRequest
}
}
APIClient
- Service ์ฝ๋๋ฅผ ์์ฑํ๋ ํ์ผ์ ๋๋ค.
- responseDecodable์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ํ์ฑํด์ฃผ๊ณ ์์ต๋๋ค.
import Foundation
import Alamofire
class APIClient {
typealias onSuccess<T> = ((T) -> Void)
typealias onFailure = ((_ error: Error) -> Void)
static func request<T>(_ object: T.Type,
router: APIRouter,
success: @escaping onSuccess<T>,
failure: @escaping onFailure) where T: Decodable {
AF.request(router)
.validate(statusCode: 200..<500)
.responseDecodable(of: object) { response in
switch response.result {
case .success:
guard let decodedData = response.value else { return }
success(decodedData)
case .failure(let err):
failure(err)
}
}
}
}
๋ง๋ฌด๋ฆฌ
์ฌ์ค์ ์์ 3๊ฐ์ ํ์ผ์ ๋ง๋ค์ด๋๊ณ ์ฌ์ฉํ๋,
๋งค ํต์ ๋ง๋ค ์๋น์ค ์ฝ๋๋ฅผ ์์ฑํ๋ ์๊ณ ๋ฅผ ๋ ์ ์์ด์ ์ข์๋ณด์
๋๋ค.
๊ทธ๋ฌ๋ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ข๋ค๋ ์๊ฐ์ ํ์ง ์๋ ๊ฑธ๋ก ํด์ผ๊ฒ ์ด์...
์ ๋ ์ด์ ๋ง ์์ ๋ฐฉ์์ ์ ์ฉํด๋ณด๊ณ ์ฌ์ฉํ๊ณ ์๋์ง๋ผ ๋ง ์ถ์ฒํ๊ธฐ๋ ์ด๋ ค์ธ ๊ฒ ๊ฐ๋ค์ ๐
์ข ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๋์ง ๋ ๊ณ ๋ฏผํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค :-)
์ด๋ฒ ๊ธ์ ํต์ฌ๋ง ์ ์ด๋์,,, ๋ด์ฉ์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์๋ ์์ ๊ฒ ๊ฐ์์...
๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๋๊ธ์ด๋ ์ฐ๋ฝ์ฃผ์ธ์ ..
์ฐธ๊ณ ๋งํฌ
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
iOS Issue(1) - Build input file cannot be found (0) | 2021.07.30 |
---|---|
[iOS] ๋๋ ๋ชจ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์๋ Generic (0) | 2021.07.29 |
[iOS] CollectionView์ PageControl๋ก Pager ๊ตฌํํ๊ธฐ (9) | 2021.07.26 |
[iOS] ๋ฐฐ์ด์ ๊ณ ์ฐจ ํจ์ - Higher Order Fuctions (0) | 2021.07.24 |
[iOS] UIKit์์ Preview ์ฌ์ฉํ๊ธฐ (3) | 2021.05.27 |