투케이2K

102. (swift/xcode) escaping (이스케이핑) 사용해 비동기 http 요청 및 응답 결과 확인 실시 (callback) 본문

Swift

102. (swift/xcode) escaping (이스케이핑) 사용해 비동기 http 요청 및 응답 결과 확인 실시 (callback)

투케이2K 2022. 8. 16. 19:22

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[소스 코드]

    // MARK: - [비동기 http 통신 요청 수행 실시]
    func callHttpAsync(reqUrl : String, completion: @escaping (Bool, String)->()) {
        
        /*
        // -----------------------------------------
        [callHttpAsync 메소드 설명]
        // -----------------------------------------
        1. 비동기 http 통신 수행 및 리턴 결과 콜백 반환 실시
        // -----------------------------------------
        2. 호출 방법 :
         self.callHttpAsync(reqUrl: "http://jsonplaceholder.typicode.com/posts?userId=1&id=1"){(result, msg) in
             print("")
             print("====================================")
             print("[A_Main >> callHttpAsync() :: 비동기 http 통신 콜백 확인]")
             print("result :: ", result)
             print("msg :: ", msg)
             print("====================================")
             print("")
         }
        // -----------------------------------------
        3. 사전 설정 사항 :
         - 필요 info plist 설정
           [1] http 허용 : App Transport Security Settings >> Allow Arbitrary Loads >> YES
        // -----------------------------------------
        4. @escaping 설명 :
         - escaping 은 함수 밖에서 실행되는 클로저입니다
         - escaping 은 비동기 http 통신에서 자주 사용됩니다
         - escaping 함수 실행 중에는 실행하지 않으며 본 예시 http 통신이 완료 된 후 수행됩니다
        // -----------------------------------------
        */
        
        
        // [http 비동기 방식을 사용해서 http 요청 수행 실시]
        let urlComponents = URLComponents(string: reqUrl)
        var requestURL = URLRequest(url: (urlComponents?.url)!)
        requestURL.httpMethod = "GET" // GET
        requestURL.addValue("application/x-www-form-urlencoded; charset=utf-8;", forHTTPHeaderField: "Content-Type") // header settings
        print("")
        print("====================================")
        print("[C_Util >> callHttpAsync() :: http 통신 요청 실시]")
        print("-------------------------------")
        print("주 소 :: ", requestURL)
        print("====================================")
        print("")
        
        
        // [http 요쳥을 위한 URLSessionDataTask 생성]
        let dataTask = URLSession.shared.dataTask(with: requestURL, completionHandler: { (data, response, error) in

            // [error가 존재하면 종료]
            guard error == nil else {
                print("")
                print("====================================")
                print("[C_Util >> callHttpAsync() :: http 통신 요청 실패]")
                print("-------------------------------")
                print("주 소 :: ", requestURL)
                print("-------------------------------")
                print("fail :: ", error?.localizedDescription ?? "")
                print("====================================")
                print("")
                
                // [콜백 반환]
                completion(false, error?.localizedDescription ?? "")
                return
            }

            // [status 코드 체크 실시]
            let successsRange = 200..<300
            guard let statusCode = (response as? HTTPURLResponse)?.statusCode, successsRange.contains(statusCode)
            else {
                print("")
                print("====================================")
                print("[C_Util >> callHttpAsync() :: http 통신 요청 에러]")
                print("-------------------------------")
                print("주 소 :: ", requestURL)
                print("-------------------------------")
                print("error :: ", (response as? HTTPURLResponse)?.statusCode ?? 0)
                print("-------------------------------")
                print("msg :: ", (response as? HTTPURLResponse)?.description ?? "")
                print("====================================")
                print("")
                
                // [콜백 반환]
                completion(false, (response as? HTTPURLResponse)?.description ?? "")
                return
            }

            // [response 데이터 획득]
            let resultCode = (response as? HTTPURLResponse)?.statusCode ?? 0 // [상태 코드]
            let resultLen = data! // [데이터 길이]
            let resultData = String(data: resultLen, encoding: .utf8) ?? "" // [데이터 확인]
            print("")
            print("====================================")
            print("[C_Util >> callHttpAsync() :: http 통신 성공]")
            print("-------------------------------")
            print("주 소 :: ", requestURL)
            print("-------------------------------")
            print("resultCode :: ", resultCode)
            print("-------------------------------")
            print("resultLen :: ", resultLen)
            print("-------------------------------")
            print("resultData :: ", resultData)
            print("====================================")
            print("")
            
            // [콜백 반환]
            completion(true, resultData)
        })

        // [network 통신 실행]
        dataTask.resume()
    }
 

[결과 출력]

 

 

반응형
Comments