본문 바로가기
Swfit

URLSession 알아보기

by GGShin 2023. 1. 16.

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

 

iOS URLSession 이해하기

iOS에서 네트워킹을 도와주는 URLSession API에 대해 알아봅니다.

hcn1519.github.io

 

반응형