URLSession은 networking을 위한 API 입니다. 사용할 때마다 순서가 잘 생각이 나지 않아서 정리해두려고 합니다 :)
작동 flow
1. URLSession 생성
let session = URLSession(configuration: .default)
session의 configuration에는 4가지 종류가 있습니다.
1) no configuration: shared로 singleton을 이용하는 경우에는 configuration이 따로 적용되지 않습니다. 요청이 제한적인 경우에 사용하기 적합합니다.
2) default configuration: shared session과 매우 유사하지만 delegate을 사용해서 data를 더 많이 가질 수 있도록 할 수 있습니다 (-> 정확히 어떤 의미인지는 알아봐야겠습니다.).
3) ephemeral configuration: default와 유사하지만 disk에 caches, cookies, or credentials를 write하지 않습니다. 어떠한 데이터도 작성하지 않습니다.
4) background configuration: App이 종료된 이후에도 content를 up/download할 수 있습니다.
2. 통신할 URL을 통한 Request 객체 설정
//URL
guard let url = URL(string: "\(urlString)") else { //urlString이라는 parameter
print("URL not available")
return
}
//Request
var request = URLRequest(url: url)
request.httpMethod = "POST"
URLRequest에서는 서버로 보내는 요청의 디테일을 명시할 수 있습니다. 어떤 주문(request)를 보낼 지 알려주는 것입니다!
캐싱 방법, timeInterval, HTTP method, HTTP header, HTTP body 등을 설정할 수 있습니다.
위의 예시에서는 httpMethod를 "POST"로 설정하였습니다.
- HTTP header 설정방법: setValue method 사용!
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
- HTTP body 설정방법: [String: Any] type의 dictionary에 원하는 Body value, key 담아준 다음에 data화 시키기!
//Dictionary 형태로 body에 담을 정보들 생성
let body: [String: Any] = [
"type": "add_network",
"bapp": [
"name": "test app",
"callback": [
"success": "https://www.google.com/search?q=success",
"fail": "https://www.google.com/search?q=fail"
]
],
"add_network": ["chain_id":"1001"]
]
var bodyData: Data = Data()
//body dictionary를 JSONSerialization으로 Data type으로 변경
do {
bodyData = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
print("Error JSON Serializastion HTTP Body Data \(error.localizedDescription)")
}
//request.httpBody에 할당
request.httpBody = bodyData
3. dataTask 실행해주기
미리 설정해 둔 session과 request를 이용해서 dataTask를 실행해준다. dataTask가 완료되면 Completion Handler가 실행된다.
session.dataTask(with: request) { data, response, error in
guard error == nil, let data = data else { return }
//dataTask에서 얻어진 data를 decode하여 원하는 값 획득할 수 있음
do {
let output = try JSONDecoder().decode(KaiKasResponse.self, from: data)
print(output.requestKey)
} catch {
print("Error JSON Decoding failed")
}
}.resume() //resume() 잊지말기!
언젠가는 이 레퍼런스 없이도 좀 더 잘 기억이 나기를 기대하면서 ㅎㅎ..
참고자료
https://hcn1519.github.io/articles/2017-07/iOS_URLSession
'Swfit' 카테고리의 다른 글
iOS App 제출 시 iPad 스크린샷 제외 (0) | 2023.05.14 |
---|---|
UICollectionViewCell Cell 플립 기능 구현하기 (0) | 2023.01.17 |
Semantic Versioning - 버전 정하는 방식 (0) | 2023.01.15 |
Missing package product <package name> 에러 해결 방법 (0) | 2023.01.14 |
accessibility identifiers 추가하는 방법 (0) | 2023.01.13 |