URL 생성
let urlString = "https://ai-hong.tistory.com/213?category=911246"
let url = URL(string: urlString)
// URL의 String 값 "https://ai-hong.tistory.com/213?category=911246"
url?.absoluteString
// URL의 네트워킹 방식 "https"
url?.scheme
// 기반이 되는 주소 "ai-hong.tistory.com"
url?.host
// URL의 디렉토리 "/213"
url?.path
// URL의 쿼리값 "category=911246"
url?.query
// 기반이 되는 URL nil
url?.baseURL
- 다음과 같은 프로퍼티들을 이용하여 URL의 정보에 대해 파악할 수 있다.
- BaseURL 의 경우 별도로 설정하지 않으면 nil 로 뜨기 때문에 BaseURL에 접근 하기 위해서는 relativeTo 프로퍼티를 별도로 baseURL을 지정해주어야 한다
// BaseURL을 설정하고 접근하기 위한 방법
let baseURL = URL(string: "https://ai-hong.tistory.com")
let relationURL = URL(string: "213?category=911246", relativeTo: baseURL)
relationURL?.absoluteString
relationURL?.scheme
relationURL?.host
relationURL?.path
relationURL?.query
relationURL?.baseURL "Optional(https://ai-hong.tistory.com)"
- BaseURL이 Optional이기 때문에 적절한 바인딩이 필요함
URLComponents
- URL 만 사용해서 구성하게 되면 쿼리 내용중 혹은 URL 내용중 한글이나 특수문자 등과 같은 것이 들어가면 서버쪽에서 Error를 내뿜게 된다, 이러한 상황을 방지하고자 Components를 사용할 수 있다
let baseURL = URL(string: "https://ai-hong.tistory.com")
let relationURL = URL(string: "213?category=한글", relativeTo: baseURL)
// 통신이 제대로 작동하지 않기 때문에 nil 출력
relationURL?.absoluteString
relationURL?.scheme
relationURL?.host
relationURL?.path
relationURL?.query
relationURL?.baseURL
→ URL 의 쿼리에 한글이 포함되어 정상적인 통신을 못하고 nil을 출력
- URLComponents 를 생성한후, URLQueryItem을 설정해 추가하여 인코딩이 되어 통신 정상적으로 수행
// URLComponents는 Query 직전까지의 주소를 할당
var urlComponents = URLComponents(string: "https://ai-hong.tistory.com/213?")
// 추가되는 쿼리들은 다음과 같이 변수로 할당
let categoryQuery = URLQueryItem(name: "category", value: "한글")
// 추가한 쿼리 Item을 urlComponents에 추가
urlComponents?.queryItems?.append(categoryQuery)
// "category=%ED%95%9C%EA%B8%80" 출력 -> 한글이 통신 가능한 상태로 인코딩된다
urlComponents?.url?.query
// "https://ai-hong.tistory.com/213?category=%ED%95%9C%EA%B8%80" 출력
urlComponents?.url?.absoluteString