-
Alomofire를 이용한 간단한 통신 방법 - (GET)Programing/iOS 2020. 7. 1. 05:52
안녕하세요~!
이번 포스팅에서는 제가 Alamofire를 통해서 GET 메소드 서버 통신을 하는 방법을 저의 방식대로 주절주절 적어볼거에요!!
저의 방법이 있고 다른 분들이 작성하는 방법도 있으니 그냥 참고만 해 주셨으면 합니다!!
우선 기본적인 환경에 대해서 설명해드리자면
Swift : version 5.1.2
Alamofire : version 4.8.2
DesignPattern: MVC
Response Type: JSON
입니다. 추후 변경될 수 있습니다~!
우선 GET메소드에서의 서버 통신에서 이루어지는 플로우는 아래와 같습니다.
ViewController에서 서버통신 메소드를 호출하고~
↓
서버통신 코드에서 통신을 합니다.
↓
서버 통신을 통해 받아온 Data를 Data의 Header Status 코드에 따라서 Data를 Decode해줄지 안해줄지 정해주세요!!
↓
Decode가 필요한 경우 미리 정해준 Model에 맞춰 Decode해주세요!!
↓
Decode가 완료 된 뒤 ViewController 코드로 Decode된 Data를 보내주면 되요!!
↓
ViewController에서 Data를 알맞는 곳에 입력해주는 절차를 해주세요!!
간단하게 설명하면 이렇게 구성이 되어있어요.
하지만 설명만으로 알려드리면 너무 정이 없으니 제가 코드를 어떻게 작성하는지 알려드릴게요!!
먼저 서버 통신 데이터를 받아올때 필요한 NetworkResult를 만들어주고 시작해보죠!!
import Foundation enum NetworkResult<T>{ case success(T) case requestErr(T) case pathErr case serverErr case networkFail }
[Vapor] Rest API 만들기 - 3 (GET)
안녕하세요, 5anniversary 입니다~! 저번 시간에 POST를 활용해 데이터베이스에 데이터를 넣어줬으니 그 데이터를 받아오는 GET method에 대해 다루어 볼 거예요~! 먼저 FluentMysql을 import 해주셔야 query 메
blog.5anniversary.dev
우선 이전에 제가 이전에 작성한 서버 코드에 맞춰서 예를 들어볼게요!!
서버에서 전달해주는 Response값을 미리 알려줄거에요.
이 Response 값을 가지고 quicktype.io 사이트에 갈거에요
Convert JSON to Swift, C#, TypeScript, Objective-C, Go, Java, C++ and more • quicktype
{ "people": [ { "name": "Atticus", "high score": 100 }, { "name": "Cleo", "high score": 900 }, { "name": "Orly" }, { "name": "Jasper" } ] } Provide sample JSON files, URLs, JSON schemas, or GraphQL queries.
quicktype.io
이렇게 넣어주면 됩니다.
오른쪽에 보시면 언어 설정과 세부 항목 설정이 있으니 경우에 따라서 설정해주시면 되구요!!
// This file was generated from JSON Schema using quicktype, do not modify it directly. // To parse the JSON, add this file to your project and do: // // let article = try? newJSONDecoder().decode(Article.self, from: jsonData) import Foundation // MARK: - Article struct Article: Codable { let status: Int let message: String let data: [Datum] } // MARK: - Datum struct Datum: Codable { let id: Int let title, contennt: String }
오른쪽에서 받아온 코드를 Model로 만들어줄거에요!!
이렇게 만들어주시구
Service 코드를 작성해볼게요!!
import Foundation import Alamofire struct ArticleService { private init() {} // static let shared = ContentService() //MARK: - 게시글(Article) 받아오기 func getArticle(completion: @escaping (NetworkResult<Any>) -> Void){ // URL let URL = (서버 URL) // Header 값 (아마 서버마다 API마다 원하는 Header값이 달라질거에요) let header: HTTPHeaders = [ "Content-Type" : "application/json" ] Alamofire.request(URL, // URL 값 method: .get, // GET 메소드를 지정해줘요 parameters: nil, // 이 경우에는 파라미터 값이 필요가 없으니 빼서 줍니다!! encoding: JSONEncoding.default, // Encoding 타입을 정해줘요 headers: header) // 위에서 넣어준 헤더값을 넣어줘요 .responseData{ response in // 이렇게 정해준 request값을 보내서 response값을 response에 넣어줘요 switch response.result { // response에서의 결과값으로 switch로 나눠줄거에요 case .success: // success일 경우에 if let status = response.response?.statusCode{ // statusCode를 가져올거에요 switch status { // 상태코드를 가지고 switch 처리를 해줘요 case 200: // 200일 경우 do{ // 에러처리를 위해서 do-catch를 쓸거에요 let decoder = JSONDecoder() // JSONDecoder를 가져오고 if let value = response.result.value { // value값을 가져오고 let result = try decoder.decode(Article.self, from: value) // value를 Artcle 모델로 Decode 해주세요 } completion(.success(result)) // 여기서!!! ViewController로 보내줍니다. } catch { completion(.pathErr) // 에러가 될 경우는 일반적으로 모델이 value에 맞지 않는 경우 납니다. } // 이제 에러 처리를 해주면 되요 ~~~ case 400: print("실패 400") completion(.pathErr) case 500: print("실패 500") completion(.serverErr) default: break } } } case .failure(let err): print(err.localizedDescription) completion(.networkFail) } } } }
이제 Service에서 Decode된 데이터를 받아서 ViewController에서 처리해주면 끝나요!!!
func signInService() { ArticleService.shared.getArticle() { responsedata in switch responsedata { // NetworkResult 의 요소들 case .success(let res): // 서버에서 넘어온 데이터를 res에 넣어주는거에요~! // ... // 여기에서 res를 알맞게 label, textview, image등등에 넣어주는 처리를 해주시면 됩니다!! case .requestErr(_): print("requestErr 에러 처리 해주세요~!") case .pathErr: print("pathErr 에러 처리 해주세요~!") case .serverErr: print("serverErr 에러 처리 해주세요~!") case .networkFail : print("networkFail 에러 처리 해주세요~!") } } }
자 여기까지 와 주셨으면 "저의 방식"으로는 Alamofire를 통해서 에러처리가 끝났습니다!!👏👏👏
'Programing > iOS' 카테고리의 다른 글
[iOS] Apollo를 이용해 Graph QL 서버와 연동해보기 - 1 (0) 2020.08.06 간단하게 알아보는 iOS 애니메이션 (0) 2020.07.02 [iOS] PopUpView 만들기 (0) 2020.05.17 [iOS] 테이블 뷰 다루기 (0) 2020.05.15 [iOS] openURL을 이용해 앱간 이동하기!! (2) 2020.05.14