Notice
Recent Posts
Recent Comments
Link
투케이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()
}
[결과 출력]
반응형
'Swift' 카테고리의 다른 글
Comments