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

 

URLSession 에 대한 개념 파악하기

+ Recent posts