Post

UIKIt - URLComponents를 활용하여 URL 생성하기

기존에는 URL 객체를 생성할 때 아래와 같이 생성했음.

1
2
3
4
5
6
7
8
9
10
11
12
13
func list(page: Int, size: Int, title: String? = nil, userSeq: String? = nil, completionHandler: @escaping (Result<PagingResponse<[BookListResponse]>, NetworkingError>) -> Void){
        
        // URL 객체 생성
        guard let url = URL(string: "\(Constants.API_URL)/books?page=\(page)&size=\(size)&title=\(title != nil ? title! : "")&userSeq=\(userSeq != nil ? userSeq! : "")") else { return }
        
        var request = URLRequest(url: url)
        
        urlSession.dataTask(with: request){ data, response, error in

            ...

        }
}

이렇게 생성하다보니 쿼리 파라미터를 붙이는데 굉장히 번거로웠고 이를 해결하기 위해서 URLComponents를 사용함.

URLComponentsURL 객체를 구성하는 구조임. URL 객체는 read-only 이지만 URLComponents는 read, write 둘 다 가능함.

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func list(page: Int, size: Int, title: String? = nil, userSeq: String? = nil, completionHandler: @escaping (Result<PagingResponse<[BookListResponse]>, NetworkingError>) -> Void){
        
        // URLComponents 객체 생성
        guard var component = URLComponents(string: "\(Constants.API_URL)/books") else { return }
        
        // 쿼리 스트링 추가
        component.queryItems = [
            URLQueryItem(name: "page", value: "\(page)"),
            URLQueryItem(name: "size", value: "\(size)"),
            URLQueryItem(name: "title", value: title),
            URLQueryItem(name: "userSeq", value: userSeq)
        ]

        // URL 생성
        guard let url = component.url else { return }
        
        var request = URLRequest(url: url)
        
        urlSession.dataTask(with: request){ data, response, error in

            ...

        }
}
This post is licensed under CC BY 4.0 by the author.