Project Jo

HTTP 통신 (URLSession) 본문

Developer/Swift

HTTP 통신 (URLSession)

Project Jo 2020. 8. 20. 20:28

개발을 하면 필수적으로 통신을 하게 된다.

 

HTTP 통신을 통해서 기본적인 정보를 가지고 오는 함수를 만들어 두고 이후에 사용이 편하도록 한다.

 

해당 통신은 코로나 시대의 마스크를 사야할때 쓸수 있는 마스크 리스트를 가지고 오는 통신이다.

 

URLSession 을 이용해서 통신을 진행하고, 성공과 실패시 블럭 함수를 통해서 외부에 알려주도록 만들어져 있다.

 

requestCorona19Masks 함수를 매인 쓰레드에서 요청 한다고 해도, 내부에서 비동기 처리를 진행한다.

 

이후 성공과 실패 여부에 따라 분기하여 함수를 호출 하도록 되어있다.

class HttpUtil: NSObject {
    
    static func getURLSessionConfiguration() -> URLSessionConfiguration {
        let sessionConfig: URLSessionConfiguration = URLSessionConfiguration.default
        
        //타임아웃을 15초로 설정한다.
        sessionConfig.timeoutIntervalForRequest = 15.0
        sessionConfig.timeoutIntervalForResource = 15.0
        
        //캐시 기능을 사용하지 않도록 설정 한다.
        sessionConfig.requestCachePolicy = .reloadIgnoringLocalCacheData
        sessionConfig.urlCache = nil
        
        return sessionConfig
    }
    
    static func requestCorona19Masks(lat: Double,
                                     lng: Double,
                                     radius: Int,
                                     completFunc: @escaping (MaskList) -> Void,
                                     errorFunc: @escaping (String) -> Void) {
        
        let strUrl = String(format:"https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/storesByGeo/json?lat=%f&lng=%f&m=%d", lat, lng, radius)
        let url = URL(string: strUrl)
        let request = URLRequest(url: url!)
        
        //타임아웃 시간을 짧게 변경한다.
        let sessionConfig = getURLSessionConfiguration()
        let session: URLSession = URLSession(configuration: sessionConfig)
        
        //요청을 진행한다.
        let task = session.dataTask(with: request) {(data, response, error) in
            
            DispatchQueue.main.sync {
                guard let data = data, error == nil else {
                    errorFunc("networking error")
                    return
                }
                
                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                    errorFunc("statusCode should be 200, but is \(httpStatus.statusCode)")
                }
                
                do {
                    guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] else {
                        errorFunc("json make error")
                        return
                    }
                    
                    let maskList: MaskList = MaskList.init(json: json)
                    completFunc(maskList)
                    
                } catch {
                    errorFunc("json make error")
                }
            }
        }
        
        task.resume()
    }
}

'Developer > Swift' 카테고리의 다른 글

코드상에서 쉽게 컬러 설정하기! colorLiteral!  (0) 2020.08.20