[SWIFT] URL encoding (URL nil이 될 때 - addingPercentEncoding)

2021. 6. 5. 18:07SWIFT

반응형

URL에 한국어를 넣거나 다른 특수문자들을 넣어야 될 때가 있는데요.

이럴 때, URL(string: someStr)을 이용하면 nil 값으로 변형되는 때가 있습니다.

 

저도 예전에 카카오 오픈 API를 이용해서 장소를 검색할 때, 분명 request에 해당하는 모든 정보를 넣었는데도 요청이 실패해서 삽질을 했던 적이 있는데요 😂

 

그 때, 정확한 URL은 기억나지 않는데 아마 이런 방식이었습니다.

www.naver.com/search?location=명동

이렇게 URL로 get 요청을 보내면 분명 response가 와야했는데, 오지 않는 상황이었습니다. (404 에러가 났죠 ㅠㅠ)

그래서 URL로 바꾸는 부분에서 찍어보니 nil 값이 나왔습니다. (그러니깐 404가 나올 수 밖에..)

let url = URL(string: www.naver.com/search?location=명동)
print(url) // nil

어떻게 여기서 해결을 했는지 알아볼게요 ㅎㅎ..

 

URL encoding

우선 URL을 encoding 할 때, 한국어는 URL로 인식할 수 있는 언어가 아니기 때문에 위의 경우에서 nil이 나오는 것이 당연합니다..!!

즉, URL로 사용할 수 있는 문자는 알파벳, 숫자, 몇 가지의 특수문자들인데 거기에 한국어를 넣고 변환하고 있었으니.. 무지했죠 😂

(아마 그냥 인터넷 주소창에 칠 때는 알아서 encoding을 해주기 때문에 가능했겠죠.. 당연히 알아서 해주겠지 생각했고)

 

그렇다면 어떻게 Swift에서는 이를 encoding할 수 있을까요?

기본적으로 String의 addingPercentEncoding(withAllowedCharacters:)라는 메소드를 제공해주고 있습니다. 

 

알기 위해서는 애플의 설명을 보고 오는게 가장 정확하겠죠?

모든 문자들을 특정 Set에 있지 않는 경우는 새롭게 대체해서 String을 만들어서 리턴해준다고 나와있습니다. 즉, 어떤 Set에 들어가지 않는 문자는 encoding을 해준다는 뜻이죠.

뭐 이렇게 encoding에 해주는 것 같은데 가장 중요한 건 이제 어떤 Set이냐?!

여기서도 가장 자주 쓰이는 몇가지가 있습니다.

 

CharacterSet

각 Set 별로 알파벳, 숫자 외에 포함할 수 있는 특수문자의 목록입니다. 여기에 포함되지 않는 문자는 encoding이 되어서 변환됩니다.

  • urlUserAllowed
! $ & \ ( ) * + , - . ; = _ ~
  • urlPasswordAllowed
! $ & \ ( ) * +  - . ; = _ ~

 

  • urlPathAllowed
! $ & \ ( ) * +  - . / : = @ _ ~
  • urlHostAllowed
! $ & \ ( ) * +  - . : ; = [ ] _ ~
  • urlFragmentAllowed
! $ & \ ( ) * +  - . / : ; = ? @ _ ~
  • urlQueryAllowed
! $ & \ ( ) * +  - . / : ; = ? @ _ ~

여기서 보통은 urlQueryAllowed, urlPathAllowed를 사용합니다..!!

 

두 Set의 차이를 보면 Query는 '?'를 포함하고 있고 Path는 '?'를 포함하고 있지 않죠?

URL에서 query에 해당하는 부분은 '?'뒤에 들어가기 때문에, '?'까지 encoding이 되어 버리면 안되기 때문에 당연히 포함되어야겠죠!

 

저 역시도 문제를 해결할 때, urlQueryAllowed를 이용해서 encoding해서 request를 보냈습니다.

let urlStr = "www.naver.com/search?location=명동"
guard let encodedStr = urlStr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return }

let url = URL(string: encodedStr)!
print(url.absoluteString)
// www.naver.com/search?location=%EB%AA%85%EB%8F%99

주목해야 할 점은 urlQueryAllowed ?를 제외하고 한국어 부분은 포함되지 않는 Set이라 encoding된 것이 보이죠?

이렇게 URL에 따라 다르게 활용해서 CharacterSet을 사용하면 됩니다 ㅎㅎㅎ :)

 

감사합니다 :)

반응형

'SWIFT' 카테고리의 다른 글

[SWIFT] KVC (Key - Value - Coding)  (0) 2021.09.20
[SWIFT] Swift Method Dispatch - Dynamic, Static  (0) 2021.06.11
[SWIFT] Metatype - self, Self, Type  (0) 2021.03.21
[SWIFT] Property Wrapper  (0) 2021.03.14
[SWIFT] OptionSet  (0) 2021.03.07