let string = "https://market-training.yagom-academy.kr/"
let url = URL(string: string)
URL의 string에는 영문, 숫자, 특정 문자만 인식 가능, 한글과 띄어쓰기는 인식 X
url?.absoluteString // 절대주소 (urlString과 동일)
url?.scheme // http? htttps?
url?.host // "itunes.apple.com"
url?.path // "/search"
url?.query // "media=music&entity=musicVideo&term=collier"
let baseURL = URL(string: "https://itunes.apple.com")
let relativeURL = URL(string: "search", relativeTo: baseURL)
relativeURL?.absoluteString // "https://itunes.apple.com/search"
relativeURL?.baseURL // https://itunes.apple.com (URL? 타입)
relativeURL?.path // "/search"
var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")!
let mediaQuery = URLQueryItem(name: "media", value: "music")
let entityQuery = URLQueryItem(name: "entity", value: "song")
let termQuery = URLQueryItem(name: "term", value: "jacob collier")
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery
URL에 포함되어 있는 한글, 띄어쓰기 등을 자동으로 인코딩하여 관리
쿼리 파라미터 등은 URLQueryItem 타입의 변수를 하여 별도로 관리Codable
Codable = Decodable + Encodable
Codable로 구현한 구조체를 만들 때, 내부 변수 이름과 JSON의 변수 이름이 같아야 함
CodingKey라는 enum과 매칭시켜야 함
{
"resultCount": 50,
"results": [
{
"wrapperType": "track",
"kind": "song",
"artistId": 28223958,
"collectionId": 295286350,
"trackId": 295286499,
"artistName": "Collier",
"collectionName": "Collier - Ep",
"trackName": "No Matter What",
"collectionCensoredName": "Collier - Ep",
"trackCensoredName": "No Matter What",
"artistViewUrl": "https://music.apple.com/us/artist/collier/28223958?uo=4",
"collectionViewUrl": "https://music.apple.com/us/album/no-matter-what/295286350?i=295286499&uo=4",
"trackViewUrl": "https://music.apple.com/us/album/no-matter-what/295286350?i=295286499&uo=4",
"previewUrl": "https://audio-ssl.itunes.apple.com/itunes-assets/Music/85/73/31/mzm.alxzrkgx.aac.p.m4a",
"artworkUrl30": "https://is2-ssl.mzstatic.com/image/thumb/Music/v4/1b/78/78/1b7878d3-7718-66b3-643b-600c4098c944/source/30x30bb.jpg",
"artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Music/v4/1b/78/78/1b7878d3-7718-66b3-643b-600c4098c944/source/60x60bb.jpg",
"artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Music/v4/1b/78/78/1b7878d3-7718-66b3-643b-600c4098c944/source/100x100bb.jpg",
"collectionPrice": 5.94,
"trackPrice": 0.99,
"releaseDate": "2008-11-05T08:55:31Z",
"collectionExplicitness": "notExplicit",
"trackExplicitness": "notExplicit",
"discCount": 1,
"discNumber": 1,
"trackCount": 6,
"trackNumber": 5,
"trackTimeMillis": 304520,
"country": "USA",
"currency": "USD",
"primaryGenreName": "Pop",
"isStreamable": true
},
]
}
struct Response: Codable {
let resultCount: Int
let tracks: [Track]
enum CodingKeys: String, CodingKey {
case resultCount
case tracks = "results"
}
}
struct Track: Codable {
let title: String // trackName
let artistName: String // artistName
let thumbnailPath: String // artworkUrl100
// 실제 JSON 키와 매핑 (똑같다면 놔두고, 다르다면 오른쪽에 JSON 키이름 입력
enum CodingKeys: String, CodingKey {
case title = "trackName"
case artistName
case thumbnailPath = "artworkUrl100"
}
}
HTTP의 데이터 자료를 가져올 때 사용, URLSession은 생성 전에 configuration이 필요
let requestURL = urlComponents.url! // URLSession - configuration 먼저 필요 let config = URLSessionConfiguration.default let session = URLSession(configuration: config).default, .ephemeral를 사용하는데 ephemeral은 로컬 스토어에 캐싱 또는 쿠키 저장 작업을 하지 않음
URLSession - dataTask
네트워크로부터 데이터를 받아올 때 리퀘스트 URL과 받아온 이후 할 작업을 설정
session.dataTask(with: URLRequest, completionHandler: (Data?, URLResponse?, Error?) -> Void)