티스토리 뷰

iOS

URLSession API

강경 2021. 1. 28. 15:43
728x90
반응형

URLSession -> URLSessionConfiguration을 통해 만들고, 여러개의 URLSessionTask를 만들어 서버와 네트워킹을 진행한다.

(Delegate를 이용해 중간 과정을 볼 수도 있다.)

 

URLSessionConfiguration을 만드는 과정에서, URL 정책에 따라 Default, Ephemeral, Background형식으로 만들 수 있다.

Default는 기본, Ephemeral은 쿠키나 세션 없이(브라우저의 private mode 등), Background는 다운로드 등에 쓰인다.

 

URLSessionTask에는 3가지가 있다.

1. URLSessionDataTask : 데이터를 받아올 때 사용한다.

2. URLSessionUploadTask : Background 지원이 안되기 때문에, 업로드 할 때 사용한다.

3. URLSessionDownloadTask : Background 지원이 안되기 때문에, 다운로드 할 때 사용한다.

 

 

URL객체를 이용하기

// URL 객체
let urlString = "https://itunes.apple.com/search?media=music&entity=musicVideo&term=Gd"
let url = URL(string: urlString)

// property
url?.absoluteString // 실제주소	: urlString과 똑같이 출력됨
url?.scheme // 프로토콜		: "https"
url?.host // 주 주소		: "itunes.apple.com"
url?.path //			: "/search"
url?.query // path에대한 조건	: "media=music&entity=musicVideo&term=Gd"
url?.baseURL //			: nil

 

baseURL을 이용하여 표현하기

// baseURL 설정
let baseURL = URL(string: "https://itunes.apple.com")
let relativeURL = URL(string: "search?media=music&entity=musicVideo&term=Gd", relativeTo: baseURL)

// property
relativeURL?.absoluteString // 실제주소	: baseURL + relativeURL
relativeURL?.scheme // 프로토콜		: "https"
relativeURL?.host // 주 주소		: "itunes.apple.com"
relativeURL?.path //			:"/search"
relativeURL?.query // path에대한 조건	: "media=music&entity=musicVideo&term=Gd"
relativeURL?.baseURL //			: https://itunes.apple.com

 

URLComponents를 이용하여 표현하기

// URLComponents - URL정보를 보다 간편하게 관리가능
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: "Gd")

urlComponents?.queryItems?.append(mediaQuery)
urlComponents?.queryItems?.append(entityQuery)
urlComponents?.queryItems?.append(termQuery)

urlComponents?.url // urlComponents?.url?.scheme -> scheme을 가져온다 : https://
urlComponents?.string
urlComponents?.queryItems // urlComponents?.queryItems?.last?.value -> 마지막 value 출력 : Gd
			// queryItems로 담으면 한국어도 인코딩이 자동으로 이루어져 서버가 이해할 수 있게 해준다.

 

 

 

< 트랙리스트(서버에서 가져온 데이터)를 오브젝트로 가져오기 >

 

     - Data -> Track 목록으로 가져온다. [Track]

     - Track struct를 만들어야 한다.

     - Data에서 struct로 파싱해야한다 (Codable을 이용 -> truct의 프로퍼티 이름과 실제 데이터의 키 이름을 맞춘다)

         - Json형태의 파일, 데이터를 오브젝트로 만들 때 Codable을 이용한다.

         - Response struct를 만들고, 그 안에 트랙이 여러개 있다. -> Response, Track을 만들어야 한다.

     - 파싱(Decoding)하여 트랙리스트 를 가져온다,

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

// URL
// URLComponents - URL정보를 보다 간편하게 관리가능

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: "Gd")

urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)

let requestURL = urlComponents.url!

// struct
struct Response: Codable {
    let resultCount: Int
    let tracks: [Track]
    
    enum CodingKeys: String, CodingKey {
        case resultCount
        case tracks = "results"
    }
}

struct Track: Codable {
    let title: String
    let artistName: String
    let thumbnailPath: String
    
    enum CodingKeys: String, CodingKey {
        case title = "trackName"
        case artistName
        case thumbnailPath = "artworkUrl100"
    }
}

// dataTask
let dataTask = session.dataTask(with: requestURL) { (data, response, error) in
    // - 에러가 있는지 확인한다.
    guard error == nil else { return }
    
    // - 상태가 "성공"인지 확인한다.
    guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return }
    let sucessRange = 200..<300 // 200대 범위를 나타냄
    
    guard sucessRange.contains(statusCode) else {
        // handle response error
        return
    }
    
    // 파싱 및 트랙 가져오기
    do {
        let decoder = JSONDecoder()
        let response = try decoder.decode(Response.self, from: resultData)
        let tracks = response.tracks
        
        // 첫 번째 트랙의 정보를 가져온다.
        print("---> tracks: \(tracks.first?.title), \(tracks.first?.thumbnailPath)")
    } catch let error {
        print("---> error: \(error.localizedDescription)")
    }    
}


dataTask.resume()

 

728x90
반응형

'iOS' 카테고리의 다른 글

Auto Layout - Anatomy of a Constraint  (0) 2021.06.19
Table View  (0) 2021.05.23
GCD  (0) 2021.01.27
Concurrency  (0) 2021.01.27
HTTP  (0) 2021.01.27