미완성

Swift With REST API (using Alamofire, in progress )

iosswift 2022. 3. 18. 01:07

TODO Server: https://github.com/hanmok/TodoServer.git
TODO SwiftCode : https://github.com/hanmok/TodoHabitREST

let baseUrl = "http://localhost:5001"
let targetUrl = "http://localhost:5001/todos"

 

 

 

 

먼저, Alamofire 의 도움을 받지 않고 REST API 호출하는 법

1. GET

func getOneTodo(id: String, completion: @escaping (Result<Todo2, Error>) -> Void ) {
        let url = "\(baseUrl)/\(id)"
        guard let URL = URL(string: url) else { return }

        var urlReq = URLRequest(url: URL)
        
        urlReq.httpMethod = HttpMethodType.get
        
        let task = URLSession.shared.dataTask(with: urlReq) { data, response, error in
            
            if let err = error {
                print("error: \(err)")
                return
                
            }
            guard let data = data else { return }
            
            DispatchQueue.main.async {
                do {
                    let todo = try JSONDecoder().decode(Todo2.self, from: data)
                    completion(.success(todo))
                } catch {
                    print("error: \(error.localizedDescription)")
                    completion(.failure(error))
                }
            }
        }.resume()
    }

 

func getAllTodos(completion: @escaping (Result<[Todo2], Error>) -> Void ) {
        let url = "\(targetUrl)"
        guard let URL = URL(string: url) else { return }
        var urlReq = URLRequest(url: URL)
        
        urlReq.httpMethod = HttpMethodType.get
        
        let task = URLSession.shared.dataTask(with: urlReq) { data, response, error in
            if let e = error {
                print("error: \(e)")
                return
            }
            
            guard let data = data else { return }
            
            DispatchQueue.main.async {
                do {
                    // json object sent from the server.
                    let todos = try JSONDecoder().decode([Todo2].self, from: data)
                    print("todos: \(todos)")
                    completion(.success(todos))
                } catch {
                    print("error: \(error.localizedDescription)")
                    completion(.failure(error))
                }
            }
        }.resume()
    }

 

POST, PATCH 의 경우 Alamofire 을 이용할 때는 동작하지만, 쓰지 않고서는 왜 제대로 작동하는지 잘 모르겠음..

Alamofire documentation 을 보고 역으로 파악하기 위해 찾아보는중. 

 

 

4. DELETE

func deleteOneTodo(id: String, completion: @escaping (Error?) -> Void) {
        let url = "\(targetUrl)/\(id)"
        guard let URL = URL(string: url) else { return }
        var urlReq = URLRequest(url: URL)

        urlReq.httpMethod = HttpMethodType.delete

        let task = URLSession.shared.dataTask(with: urlReq) { data, response, error in

            guard error == nil else {
                print("error : \(error?.localizedDescription)")
                completion(error)
                return
            }

            completion(nil)

        }.resume()
    }
func deleteAllTodos() {
        
        let url = "\(targetUrl)"
        guard let URL = URL(string: url) else { return }
        var urlReq = URLRequest(url: URL)
        urlReq.httpMethod = HttpMethodType.delete
        
        let task = URLSession.shared.dataTask(with: urlReq) { data, response, error in
            guard error == nil else { print("error!! : \(error)"); return }
            
            print("response: \(response)")
        }.resume()
    }

 

 

 

 

Alamofire

1. GET

func getAll() {
    AF.request("http://localhost:5001/todos").response { response in
        let newData = String(data: response.data!, encoding: .utf8)
        
        do {
            self.todos = try JSONDecoder().decode([Todo2].self, from: newData!.data(using: .utf8)!)
        } catch {
            print("failed to decode!")
        }
        print("todo: \(self.todos)")
        print("todoCount :\(self.todos.count)")
    }
}
func getOne() {
    AF.request("http://localhost:5001/todos/614b423a799255beccc10a40").response { response in
        let newData = String(data: response.data!, encoding: .utf8)
        
        do {
            let newTodo = try JSONDecoder().decode(Todo2.self, from: newData!.data(using: .utf8)!)
			// do something with new Todo 
        } catch {
            print("failed to decode!")
        }

    }
}

2. POST

func postTodoAF(onDate: String, title: String) {
    AF.request("\(baseUrl)/todos", method: .post, parameters: ["title": title, "onDate": onDate ], encoding: URLEncoding.httpBody, headers: HTTPHeaders.init()).responseJSON { response in
        print("addtodo, \(response)")
    }
}

3. PATCH

func patchOne(id: String, newTitle: String, newOnDate: String) {
    AF.request("\(baseUrl)/todos/\(id)", method: .patch, parameters: ["title": newTitle, "onDate": newOnDate ], encoding: URLEncoding.httpBody, headers: HTTPHeaders.init()).responseJSON { response in
        print("patchOne, \(response)")
    }
}

4. DELETE

func deleteTodosAF() {
    AF.request(targetUrl, method: .delete,   headers: HTTPHeaders.init()).responseData { response in
        print("response: \(response)")
    }
}
func deleteTodoAF(id: String) {
    AF.request(targetUrl + "/" + id, method: .delete,   headers: HTTPHeaders.init()).responseData { response in
        print("response: \(response)")
    }
}



코드를 일관성 있게 바꾸기.
BaseUrl or targetUrl 을 쓰든가 주소를 직접 쓰든가.
Parsing 할 때 과정을 더 공부하기.
AF 를 통해 가져온 것을 Swift 의 Object 로 바꾸는 과정

위 과정은 https://stackoverflow.com/questions/30838752/how-to-convert-json-data-from-alamofire-to-swift-objects

 

How to convert json data from alamofire to swift objects

hi there im making a photo viewer app in swift using swift 1.1 in xcode 6.2 i am a having trouble trying to convert json response from alamofire to swift objects.i have used swiftyjson lib...

stackoverflow.com


여기 참고해서 만들어보기.
(그런데 TiStory 버그가 좀 있다... )