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 |
댓글