본문 바로가기

iOS 개발/코로나검사소 앱(RxSwift)

코로나 검사소 - 2. 네트워크 통신

반응형

 

안녕하세요. Skillist입니다

코로나 검사소 프로젝트에 대한 포스팅을 빨리 끝내고 RxSwift 개발 하고싶어요!!!!!!

 

———————————————————————————————————————————————————

 

먼저 공공데이터 API를 사용한다고 말씀드렸죠?

 

https://www.data.go.kr/iim/api/selectAPIAcountView.do

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

가입하고, api 사용 신청하세요~

 

———————————————————————————————————————————————————

 

api response에 대한 decodable입니다.

딱히 설명하지 않겠습니다.

 

제가 포스팅한 codable 생성 툴 사용해보세요 진짜 편해요. 중간중간 오류나는 경우가 있는데 이땐 좀... 그럴땐 웹툴로 이용해보세요.

https://skillist.tistory.com/266?category=471174 

 

Codable 생성 툴 소개 - quicktype

안녕하세요. Skillist입니다. 이번엔 생산성 향상에 도움을 주는 툴을 소개할게요. 저는 매번 Codable를 작성할때, json 보느라 눈 아프고, 에러 발생시 오타를 찾느라 고생했었는데, 이를 한번에 해

skillist.tistory.com

 

 

———————————————————————————————————————————————————

 

이번은 기본 url component입니다.

 

23라인 : 코로나 센터의 max count가 300을 넘지 않아, 한페이지에 모든 코로나 센터를 받을 수 있도록 쿼리파람을 설정했어요.

 

———————————————————————————————————————————————————

 

이번은 네트워크 통신 메소드 입니다.

20라인 : urlComponent를 받아오죠

 

27라인 : 공공데이터 api의 키를 설정합니다.

 

29라인 : 통신을 통해, 받아온 결과를 리턴하는 single을 리턴합니다. single은 성공 혹은 실패만 반환해주죠.

 

32라인 : 데이터를 디코딩 해보고, 성공 시 데이터를 리턴합니다. 

 

35, 39라인 : 실패시 실패를 리턴합니다.

 

41라인 : 옵저버블을 single로 변환해줍니다.

 

———————————————————————————————————————————————————

 

그리고 호출하면, 네트워크 통신에 대한 결과를 받아볼 수 있습니다.

 

 

 

———————————————————————————————————————————————————

 

역시 글로 설명을 잘 못하겠네요.

설명 잘 못하면 모다? 잘 모르는것이다.

코드만 봐주세요 열심히 공부하겠습니다.

 

잘못되거나 부족한 내용 등, 피드백 감사합니다!

 

https://github.com/DeveloperSkillist/CoronaCenterRxSwift

 

GitHub - DeveloperSkillist/CoronaCenterRxSwift

Contribute to DeveloperSkillist/CoronaCenterRxSwift development by creating an account on GitHub.

github.com

 

 

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓  전체 코드  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

import Foundation
import CoreLocation

struct CenterAPIResponse: Decodable {
    let data: [Center]
}

struct Center: Hashable, Decodable {
    let id: Int
    let sido: Sido
    let facilityName: String
    let address: String
    let lat: String
    let lng: String
    let centerType: CenterType
    let phoneNumber: String
    
    enum CenterType: String, Decodable {
        case central = "중앙/권역"
        case local = "지역"
    }
    
    enum Sido: String, Decodable, CaseIterable, Identifiable {
        case 서울특별시
        case 부산광역시
        case 대구광역시
        case 인천광역시
        case 광주광역시
        case 대전광역시
        case 울산광역시
        case 세종특별자치시
        case 경기도
        case 강원도
        case 충청북도
        case 충청남도
        case 전라북도
        case 전라남도
        case 경상북도
        case 경상남도
        case 제주특별자치도
        
        var id: String {
            return self.rawValue
        }
    }
    
    var coordinate: CLLocationCoordinate2D {
        return CLLocationCoordinate2D(
            latitude: CLLocationDegrees(self.lat) ?? .zero,
            longitude: CLLocationDegrees(self.lng) ?? .zero
        )
    }
}
import Foundation

struct CenterAPI {
    static let scheme = "https"
    static let host = "api.odcloud.kr"
    static let path = "/api/15077586/v1/centers"
    
    func getCenterListComponents() -> URLComponents {
        var components = URLComponents()
        
        components.scheme = CenterAPI.scheme
        components.host = CenterAPI.host
        components.path = CenterAPI.path
        
        components.queryItems = [
            URLQueryItem(name: "perPage", value: "300")
        ]
        
        return components
    }
}
import RxSwift
import Foundation

class CenterNetwork {
    private let session: URLSession
    let api = CenterAPI()
    
    init(session: URLSession = .shared) {
        self.session = session
    }
    
    func getCenters() -> Single<Result<CenterAPIResponse, URLError>> {
        guard let url = api.getCenterListComponents().url else {
            return .just(.failure(URLError(.badURL)))
        }
        
        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "GET"
        //"APIKey.key"에 본인의 api key를 입력하세요.
        request.setValue("Infuser \(APIKey.key)", forHTTPHeaderField: "Authorization")
        
        return session.rx.data(request: request as URLRequest)
            .map { data in
                do {
                    let centerAPIResponse = try JSONDecoder().decode(CenterAPIResponse.self, from: data)
                    return .success(centerAPIResponse)
                } catch {
                    return .failure(URLError(.cannotParseResponse))
                }
            }
            .catch { _ in
                .just(.failure(URLError(.cannotLoadFromNetwork)))
            }
            .asSingle()
    }
}
반응형