iOS 와 서버 간의 http 프로토콜을 지원하며 Request와 Response 구조를 가진다.
URLSession은 여러 개의 URLSessionTask를 생성하여 이를 통해 서버와 통신을 하고, Delegate로 네트워크의 과정을 확인하는 형태이다.
URLSession은 네트워크 관련 클래스로 URL구조에서 데이터를 다운로드하고 업로드 하는 API를 제공한다
앱이 실행되지 않거나 중단된 동안 백그라운드에서 다운로드를 수행
인증을 지원하고 리디렉션 및 작업 완료와 같은 이벤트를 수신
let defaultSession = URLSession(configuration: .defualt)
let ephemeralSession = URLSession(configuration: .ephemeral)
let backgroundSession = URLSession(configuration: .background)
Chap1. URLComponents를 이용한 URL 생성
직접 URL을 작성하여도 되지만 path와 queryItem 가 바뀔 때마다 전체 주소를 변경한다면 번거롭겠죠? 하지만 URLComponents를 사용하여 따로 관리한다면? 변경되는 부분만 수정하면 된다!
import Foundation
// URLComponents를 사용하여 URL 구성
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "www.example.com"
urlComponents.path = "/api/v1/users"
urlComponents.queryItems = [
URLQueryItem(name: "page", value: "1"),
URLQueryItem(name: "per_page", value: "10")
]
// URL 구성 요소를 사용하여 URL 생성
if let url = urlComponents.url {
print("URL: \(url)") // 출력: "URL: https://www.example.com/api/v1/users?page=1&per_page=10"
}
URLRequest는 URL요청에 필요한 정보를 포함시키며, 아래와 같은 구성요소가 있다
🔎 URLRequest 구성 요소
위에서 만든 URL에 method/header/body를 추가해보자!
위에서 만든 URL 코드에 이어 URLRequset 코드를 작성
// URLRequest 인스턴스 생성
var request = URLRequest(url: url)
request.httpMethod = "POST" // 요청에 사용할 HTTP 메서드 설정
// HTTP 헤더 설정
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
// HTTP 바디 설정
let body = [
"title": "My first post",
"body": "This is the content of my first post",
"userId": 1
] as [String: Any]
do {
request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
print("Error creating JSON data")
}
import Foundation
// URLComponents를 사용하여 URL 구성
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "www.example.com"
urlComponents.path = "/api/v1/users"
urlComponents.queryItems = [
URLQueryItem(name: "page", value: "1"),
URLQueryItem(name: "per_page", value: "10")
]
// URL 구성 요소를 사용하여 URL 생성
if let url = urlComponents.url {
print("URL: \(url)") // 출력: "URL: https://www.example.com/api/v1/users?page=1&per_page=10"
}
// URLRequest 인스턴스 생성
var request = URLRequest(url: url)
request.httpMethod = "POST" // 요청에 사용할 HTTP 메서드 설정
// HTTP 헤더 설정
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
// HTTP 바디 설정
let body = [
"title": "My first post",
"body": "This is the content of my first post",
"userId": 1
] as [String: Any]
do {
request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
print("Error creating JSON data")
}
// URLSession을 사용하여 요청 수행
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error: \(error)")
} else if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 201 {
do {
if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
print("JSON Response: \(json)")
}
} catch {
print("Error parsing JSON response")
}
} else {
print("Unexpected error")
}
}
task.resume() // 작업 시작