Swift

addingPercentEncoding(withAllowedCharacters:)

GREEN.1229 2023. 1. 2. 21:27

안녕하세요. 그린입니다🍏

이번 포스팅에서는 addingPercentEncoding(withAllowedCharacters:)이라는 메서드에 대해서 학습해보겠습니다🙌

 

왜 필요할까요?

네트워크 통신 시 URL 헤더 파라미터로 한글이 포함된 key 값을 넘겨줄때가 있을거에요.

그럴때 인코딩을 시도하고 기본적으로 정해진 타입에 따라 인코딩이 됩니다.

여기에는 한글이나 특수문자 및 공백 등이 포함되지 않았기에 유효하지 않은 URL을 요청하게 되고 정상적인 동작을 하지 않습니다😭

예를들어 아래와 같이 URL을 보내면 문제를 일으켜요!

let url = URL("https://itunes.apple.com/search?term=몽실&entity=software"!)
// 네트워크 통신

몽실이라는 key가 들어가서 그렇습니다🙌

 

그럼 이제 이걸 어떻게 해결할지 오늘 주제에 대해 시작하겠습니다🕺🏻

 

addingPercentEncoding(withAllowedCharacters:)

지정된 Set에 없는 모든 문자를 %로 인코딩된 문자로 대체하여 새 문자열을 만듭니다.

선언은 아래와 같아요.

func addingPercentEncoding(withAllowedCharacters allowedCharacters: CharacterSet) -> String?

여기서 allowedCharacters라는 CharacterSet 타입의 파라미터를 받습니다.

CharacterSet 타입에는 static 변수로 이미 지정된 값들이 있습니다.

이 타입은 검색 작업에 사용될 유니코드 문자 값 집합입니다.

우리가 이어서 볼 urlQuearyAllowed도 여기 지정된 값이죠🙌

이 인자를 통해 특정 URL 구성 요소를 가지고 새 문자열을 만들어줍니다.

여기서 주의할 점은 이미 인코딩 된 문자열에 해당 메서드를 호출하면 안됩니다🙅🏻

이미 퍼센트 인코딩 시퀀스의 퍼센트 문자가 두번 퍼센트 인코딩됩니다.

 

그럼 실제 적용하면 어떻게 되는지 보시죠🙋🏻

 

사용하기

위에서 말했듯 CharacterSet 해당 타입으로 지정된 값을 사용하면 기존 정의된 문자 값을 인코딩 시키지 않고 키워드로 취급하도록 해줍니다.

우리가 주로 사용하는것은 urlQuearyAllowed입니다.

위의 URL 문자열 예시에서도 보듯이 ?(물음표)와 한글이 들어가기에 이것들을 위한 처리가 필요하죠.

그럴때 쿼리 URL 구성 요소에서 정해진 허용되는 문자에 대해 키워드로 취급할 수 있도록 urlQuearyAllowed를 사용합니다.

해당 변수에 담긴 값은 아래와 같습니다.

한글 ! & $ ( ) \ * + : ; / . = @ ~ _ ?

 

그럼 이걸 이해했으니 위 에러가 나던 요청을 정상적으로 바꿔보죠🙌

let str = "https://itunes.apple.com/search?term=몽실&entity=software"!
  .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = URL(string: url!)
// 네트워크 통신

이렇게 문자열을 재구성하고 URL 인코딩을 해준다면 정상적인 네트워크 통신을 해줄 수 있습니다!

 

마무리

이번 포스팅은 짧지만 왜 한글과 특수문자의 쿼리 값을 넘겨주면 기본적으로 되지 않는지 어떻게 처리해야 되는지 알아볼 수 있는 좋은 기회였습니다ㅎㅎ

새해 첫 포스팅이네요🙇🏻

 

[참고 자료]

https://developer.apple.com/documentation/foundation/nsstring/1411946-addingpercentencoding

 

Apple Developer Documentation

 

developer.apple.com

https://developer.apple.com/documentation/foundation/characterset

 

Apple Developer Documentation

 

developer.apple.com