본문 바로가기
iOS

Swift - REST API(URL Session,URL Request ,URL SessionTask)

by minsol Kim 2024. 4. 20.

REST API

- REST API는 HTTP 요청을 사용하여 데이터에 액세스하고 사용하는 API

- 해당 데이터는 리소스와 관련된 작업의 읽기, 업데이트, 생성 및 삭제 를 나타내는 GET,PUT,POST 및

DELETE 데이터 유형에 사용 

 

- URL Session 타입 3가지 

Default Session: : 기본적인 session으로 디스크 기반 캐싱을 지원

Ephemeral Session : 어떠한 데이터도 저장하지 않는 형태의 세션 ( 시크릿세션)

Background Session : 앱이 종료된 이후에도 통신이 이뤄지는 것을 지원하는 세션

let defaultSession = URLSession(configuration: .default)

- URL Request

 서버로 요청을 보낼 때 어떻게 데이터를 캐싱할 것인지, 어떤 HTTP 메소드를 사용할 것인지 (Get, Post 등).

어떤 내용을 전송할 것 인지 등을 설정

  URL Request 객체 생성

📍 URL Request 객체 속성 설정

 var httpMethod: String? // GET OR POST 방식 선택 

• var allHTTPHeaderFields: [String : String]? 

• func addValue(String, forHTTPHeaderField: String) // 헤더 필드와 값을 추가

var request = URLRequest(url: url)
request.addValue("application/json",forHTTPHeaderField:"Content-Type")

 

• func setValue(String?, forHTTPHeaderField: String)  // 헤더 필드와 값을 설정

• func value(forHTTPHeaderField: String) -> String? // 헤더 값을 읽음 

 

- URL SessionTask 3종류 

 Task 객체는 일반적으로 Session 객체가 서버로 요청을 보낸 후 , 응답을 받을 때 URL 기반의 내용들을 받는 (completion handler) 역할

 

• Data Task - Get 요청을 위해 사용하는 Task,  데이터 객체를 주고 받는 Task

Download Task - data 파일의 형태로 전환 후 다운 받는 Task

Upload Task - Post 또는 PUT Method 를 동해 data 파일의 형태로 전환 후 업로드하는 Task

Stream Task – 스트리밍으로 데이터를 받는 경우

 

func dataTask(with request: URLRequest, completionHandler: complete) -> URLSessionDataTask

 

complete : @escaping(Data?, URLResponse?, Error?) -> Void

 

dataTask 함수는 main thread 가 실행하는 것으로 completionHandler 을 등록 후 바로 리턴한다. @escaping 는 리턴 후에도 유효하도록 지원한다.

 

@escaping 을 사용하는 이유 

 

파라미터로 받은 closure는 비동기로 사용하므로 @escaping 키워드를 사용하여 이 함수의 실행 흐름 상관없이 실행되는 클로저다. 

func escapingTest(completion: @escaping () -> ()) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        completion()
    }
}

- Completion Handler

Task.resume()으로 서비스를 요청하면 서비스 완료 후 호출되는 함수

Sub thread에 의하여 실행, UI 변경 시 에러가 되니 항상 주의 

import UIKit

let session = URLSession(configuration: .default)
let url = URL(string: "https://www.naver.com")

let request = URLRequest(url: url!)	// 디폴트가 GET방식이다.

let dataTask = session.dataTask(with: url!) {
    (data, response, error) in
    if let error = error {
        print(error)
        return
    }
    if let jsonData = data{
        if let jsonString = String(data: jsonData, encoding: .utf8){
            print(jsonString)
        }
    }
}
dataTask.resume()

resume() 을 하면 통신 시작 

 

 

'iOS' 카테고리의 다른 글

Swift - override  (0) 2024.04.20
Swift - ViewController 의 LifeCycle  (1) 2024.04.20
Swift - Sync 와 ASync  (0) 2024.04.20
Swift - Optional 정리  (1) 2024.04.19
Swift - 클로저(Closure) 함수  (0) 2024.04.19

댓글