Swift에서 Alamofire를 이용한 RESTAPI
Swift에서 Alamofire를 이용한 RESTAPI
Alamofire는 swift에서 REST API를 쉽게 하기위해 만들어진 패키지이다 pod으로 설치가 가능하고 add/package를 통해서 프로젝트에 다운 받을 수 있다
Alamofire 패키지 설치
add package를 선택
오른쪽 주소 창에 패키지 github 주소 “https://github.com/Alamofire/Alamofire”를 넣고 패키지를 설치한다
GET 요청하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//
// User.swift
// restapi
//
// Created by 김민정 on 10/28/24.
//
import Alamofire
struct User: Codable {
let id: Int
let name: String
let email: String
}
class APIService {
// 예시 API 엔드포인트 URL
let baseURL = "https://jsonplaceholder.typicode.com"
func fetchUsers(completion: @escaping (Result<[User], Error>) -> Void) {
let url = "\(baseURL)/users"
AF.request(url, method: .get).responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
completion(.success(users))
case .failure(let error):
completion(.failure(error))
}
}
}
}
위 코드에서 fetchUsers 함수는 /users 엔드포인트에서 JSON 데이터를 받아와서 User 구조체로 디코딩하는 함수이다
여기 함수 fetchUsers의 completion: 은 완료후 호출될 클로저 이 클로저는 호출 결과에 따라 성공 또는 실패를 처리한다 여기서 @escaping은 하나의 속성으로 비동기적으로 만즐어준다고 한다
Result 타입은 성공과 실패의 두 가지 상태를 나타낼 수 있다
.success([User]): 성공적으로 데이터를 가져왔을 때의 상태로,[User]배열을 반환.failure(Error): 요청이 실패한 경우의 상태로, 오류를 반환
위 함수를 호출하는 페이지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import SwiftUI
struct ContentView: View {
let apiService = APIService()
var body: some View {
VStack {
Image(systemName: "iphone.homebutton.circle").onTapGesture {
apiService.fetchUsers { result in
switch result {
case .success(let users):
print("Fetched Users: \(users)")
case .failure(let error):
print("Error: \(error)")
}
}
}
}
.padding()
}
}
#Preview {
ContentView()
}
이미지를 클릭하면 User.swift에서 작성한 함수가 호출되면서 유저 결과가 반환된다
결과
1
Fetched Users: [Api.User(id: 1, name: "Leanne Graham", email: "Sincere@april.biz"), Api.User(id: 2, name: "Ervin Howell", email: "Shanna@melissa.tv"), Api.User(id: 3, name: "Clementine Bauch", email: "Nathan@yesenia.net"), Api.User(id: 4, name: "Patricia Lebsack", email: "Julianne.OConner@kory.org"), Api.User(id: 5, name: "Chelsey Dietrich", email: "Lucio_Hettinger@annie.ca"), Api.User(id: 6, name: "Mrs. Dennis Schulist", email: "Karley_Dach@jasper.info"), Api.User(id: 7, name: "Kurtis Weissnat", email: "Telly.Hoeger@billy.biz"), Api.User(id: 8, name: "Nicholas Runolfsdottir V", email: "Sherwood@rosamond.me"), Api.User(id: 9, name: "Glenna Reichert", email: "Chaim_McDermott@dana.io"), Api.User(id: 10, name: "Clementina DuBuque", email: "Rey.Padberg@karina.biz")]
POST 요청하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//
// User.swift
// Api
//
// Created by 김민정 on 10/28/24.
//
import Alamofire
struct NewUser: Codable {
let name: String
let email: String
}
func createUser(newUser: NewUser, completion: @escaping (Result<User, Error>) -> Void) {
let baseURL = "https://jsonplaceholder.typicode.com"
let url = "\(baseURL)/users"
AF.request(url, method: .post, parameters: newUser, encoder: JSONParameterEncoder.default).responseDecodable(of: User.self) { response in
switch response.result {
case .success(let user):
completion(.success(user))
case .failure(let error):
completion(.failure(error))
}
}
}
함수를 정의 한다 get과 다른점은 AF.request를 실행할때 파라피터가 추가되고 인코더가 추가되었다
함수 호출하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//
// ContentView.swift
// Api
//
// Created by 김민정 on 10/28/24.
//
import SwiftUI
struct ContentView: View {
let apiService = APIService()
let newUser = NewUser(name: "John Doe", email: "john.doe@example.com")
var body: some View {
VStack {
Image(systemName: "rectangle.and.pencil.and.ellipsis").onTapGesture{
createUser(newUser: newUser) { result in
switch result {
case .success(let user):
print("User Created: \(user)")
case .failure(let error):
print("Error: \(error)")
}
}
}
}
.padding()
}
}
#Preview {
ContentView()
}
결과
1
User Created: User(id: 11, name: "John Doe", email: "john.doe@example.com")
보내고 받는 기본적인 방법을 알았지만 프로젝트 별로 사람 별로 방식이 다양하고 데이터를
받을 때 다른 형식으로 받을 수 있기 때문에 많은 코드를 보는 것이 중요할것 같다
This post is licensed under CC BY 4.0 by the author.