๋ฌธ์ ์ 1
๊ณต๊ณต๋ฐ์ดํฐํฌํธ์์ ์ ๊ณต๋๋ ํค๋ ์ธ์ฝ๋ฉ์ด ํ ๋ฒ๋ ์๋น์คํค๋ค.
urlComponents์ queryItems๋ฅผ ํตํด์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๋ url์ ์์ฑํ๋ ๊ณผ์ ์์
ํ๋ฒ ๋ ์ธ์ฝ๋ฉ์ด ๋์ด 2๋ฒ ์ธ์ฝ๋ฉ์ด ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ธ์ฝ๋ฉ์ด 2๋ฒ๋จ์ ๋ฐ๋ผ, ์์ฑ๋ url์ ์ฃผ์๊ฐ ๋ฌ๋ผ์ ธ ์๋ฒ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์์๋ค.
๋ฌธ์ ํด๊ฒฐ1
ํด๋น ์ฌํญ์ ๊ตฌ๊ธ๋ง์ ํตํด ์ธ์ฝ๋ฉ์ด ๋๋ฒ ๋์ด ๋ฐ์ํ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์์๋ค.
์ธ์ฝ๋ฉ์ด ๋ ๋ฒ๋ ๊ฒ์ด ๋ฌธ์ ์์ผ๋ฏ๋ก, ๋์ฝ๋ฉ์ ํด์ค๋ค.
๊ณต๊ณต๋ฐ์ดํฐํฌํธ์ ๋ง์ดํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์ธ์ฝ๋ฉ๋ ์ธ์ฆํค์ ๋์ฝ๋ฉ๋ ์ธ์ฆํค ๋ ๋ค ์ ๊ณตํ๊ณ ์๋ค.
๊ธฐ๋ณธ ์ธ์ฝ๋ฉ๋ ํค๋ฅผ ์ฌ์ฉํด ์๋์ ๊ฐ์ด removingPercentEncoding ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ๋์ฝ๋ฉํ ์๋ ์๋ค.
๋ฆฌ์๋ฒ์์ ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ๋ชจ๋ ์ํ์ค๋ฅผ UTF-8 ๋ฌธ์๋ก ๋์ฒดํ์ฌ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
๋ฐํ ๊ฐ:
ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ์ํ์ค๊ฐ ์ ๊ฑฐ๋ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ฉฐ, ๋ฆฌ์๋ฒ์ ์๋ชป๋ ํผ์ผํธ ์ธ์ฝ๋ฉ ์ํ์ค๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด nil์ ๋ฐํํฉ๋๋ค.
์ค์:
์ด ๋ฉ์๋๋ ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์๋ง ํธ์ถํด์ผ ํฉ๋๋ค. ํผ์ผํธ ์ธ์ฝ๋ฉ๋์ง ์์ ๋ฌธ์์ด์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํผ์ผํธ ๋ฌธ์๊ฐ ํผ์ผํธ ์ธ์ฝ๋ฉ ์ํ์ค์ ์์์ผ๋ก ์๋ชป ํด์๋ ์ ์์ต๋๋ค.
๋์ฝ๋ฉ ๋ ํค๋ฅผ ๋น๊ตํด๋ณธ๋ค๋ฉด ์์ ๊ฐ์ด ํน์๋ฌธ์๊ฐ %๋ก ํผ์ผํธ์ธ์ฝ๋ฉ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ๋์ฝ๋ฉ๋ ํค๋ฅผ ์์๋ก ํ ๋นํด์ url์ ๋ง๋ค์์ผ๋ +๋ฅผ ์ ์ธํ ํน์๋ฌธ์๋ง ์ธ์ฝ๋ฉ์ด ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
URLComponents๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก URL์ธ์ฝ๋ฉ ์ฒ๋ฆฌ๊ฐ ๋๋ค.
ํน์๋ฌธ์๋ ๊ณต๋ฐฑ์ด ํฌํจ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ํผ์ผํธ ์ธ์ฝ๋ฉ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ +๋ง ํผ์ผํธ ์ธ์ฝ๋ฉ์ด ๋์ง ์๋ ์ด์ ๋, +๊ฐ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์์ ๊ณต๋ฐฑ์ ๋ํ๋๋ ํ์ค ๋ฌธ๋ฒ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค.
RFC 3986์ ๋ฐ๋ผ ์ฟผ๋ฆฌ ๋ฌธ์์ด์์ +๋ ๊ณต๋ฐฑ(%20)์ผ๋ก ํด์๋๋ค.
+๋ ๊ณต๋ฐฑ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํน์ ๋ฌธ์๋ก ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์์ ์ธ์ฝ๋ฉ๋์ง ์์ผ๋ฉฐ,
๋๋จธ์ง ํน์ ๋ฌธ์(์: =, &)๋ ์๋์ผ๋ก ํผ์ผํธ ์ธ์ฝ๋ฉ๋๋ค.
URL์ ๊ตฌ์ฑ ์์๋ก ๋ถํดํ๊ณ , ์ด๋ค ๊ตฌ์ฑ ์์๋ก๋ถํฐ URL์ ์์ฑํ๋ ๊ตฌ์กฐ์ฒด์ ๋๋ค.
์ด ๊ตฌ์กฐ์ฒด๋ RFC 3986์ ๋ฐ๋ผ URL์ ๋ถ์ํ๊ณ ๊ตฌ์ฑํฉ๋๋ค. ์ด ๊ตฌ์กฐ์ฒด์ ๋์์ ๊ตฌํ RFC์ ๋ฐ๋ฅด๋ URL ๊ตฌ์กฐ์ฒด์ ๋ฏธ์ธํ๊ฒ ๋ค๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ URLComponents ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก URL ๊ฐ์ ์ฝ๊ฒ ์ป๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก๋ ๊ฐ๋ฅํฉ๋๋ค.
RFC 3986์ ๊ด๋ จ๋ ๊ธ
addingPercentEncoding(withAllowedCharacters:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์
API ์๋น์ค ํค์ ๋ํด์ CharacterSet์ ์ง์ ์ ์ํ์ฌ ํ์ํ ํน์๋ฌธ์๋ฅผ ์๋์ผ๋ก ์ธ์ฝ๋ฉํด์ฃผ๊ธฐ๋ก ํ๋ค.
**์ฐธ๊ณ ) CharacterSet **
Unicode character์ ๋ชจ์์ด๋ค. ์ด CharacterSet์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ ๋ฌธ์์ด์ ๊ฒ์ํ ์ ์๋ค.
ํน์ ์งํฉ์ ํฌํจ๋์ง ์์ ๋ชจ๋ ๋ฌธ์๋ฅผ ํผ์ผํธ ์ธ์ฝ๋ฉ ๋ฌธ์๋ก ๋์ฒดํ์ฌ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
-> ์ฆ, ํน์ ์งํฉ์ ํฌํจ๋ ๋ฌธ์๋ค์ ์ธ์ฝ๋ฉ ๋์ง ์๋๋ค.
-> ๋์ ๊ฒฝ์ฐ์๋ +๋ง ํน์ ์งํฉ์ ํฌํจ๋์ง ์๊ฒ ํด์ผํ๋ค๋ ๊ฒ.
๋งค๊ฐ๋ณ์
allowedCharacters: ๋ฌธ์์ด์์ ๋์ฒด๋์ง ์๋ ๋ฌธ์๋ค์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก, URL ๊ตฌ์ฑ ์์์ ๋ํ ๋ฏธ๋ฆฌ ์ ์๋ ๋ฌธ์ ์งํฉ ์ค ํ๋๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, urlPathAllowed๋ urlQueryAllowed์ ๊ฐ์ ๊ฒ์ด ์์ต๋๋ค.
**์ฐธ๊ณ ) urlQueryAllowed **
์ฟผ๋ฆฌ URL ๊ตฌ์ฑ ์์์์ ํ์ฉ๋๋ ๋ฌธ์์ ๋ฌธ์ ์งํฉ์ ๋ฐํํฉ๋๋ค.
**์ฐธ๊ณ ) urlQueryAllowed **
CharacterSet์ ์ ๋์ฝ๋ ํธํ ๋ฌธ์์ ์งํฉ์ ๋ํ๋ ๋๋ค. Foundation ํ์ ์ CharacterSet์ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ค์ ๊ทธ๋ฃนํํ์ฌ ๊ฒ์ ์์ ์ ์ํํ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฒ์ ์ค ํน์ ๋ฌธ์ ์งํฉ์ ์ํ๋ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฐํ ๊ฐ
์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋ฐํํ๊ฑฐ๋, ๋ณํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ nil์ ๋ฐํํฉ๋๋ค.
์ค๋ช
์ ์ฒด URL ๋ฌธ์์ด์ ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ์ ์์ต๋๋ค. ๊ฐ URL ๊ตฌ์ฑ ์์๋ ํ์ฉ๋๋ ๋ฌธ์์ ์๋ก ๋ค๋ฅธ ์งํฉ์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด, URL์ ์ฟผ๋ฆฌ ๊ตฌ์ฑ ์์๋ "@" ๋ฌธ์๋ฅผ ํ์ฉํ์ง๋ง, ์ด ๋ฌธ์๋ ๋น๋ฐ๋ฒํธ ๊ตฌ์ฑ ์์์์๋ ํผ์ผํธ ์ธ์ฝ๋ฉ๋์ด์ผ ํฉ๋๋ค.
UTF-8 ์ธ์ฝ๋ฉ์ด ์ฌ๋ฐ๋ฅธ ํผ์ผํธ ์ธ์ฝ๋ฉ ๋ฌธ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. allowedCharacters์ ์๋ 7๋นํธ ASCII ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฌธ์๋ ๋ฌด์๋ฉ๋๋ค.
์ค์
์ด๋ฏธ ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์ ๋ฉ๋๋ค. ์ด๋ฏธ ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ํผ์ผํธ ์ธ์ฝ๋ฉ๋ ์ํ์ค์ ํผ์ผํธ ๋ฌธ์๊ฐ ๋ ๋ฒ ํผ์ผํธ ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ด๊ฐ ํด์ผํ ์ผ: "+"๋ง ์ธ์ฝ๋ฉ์ ์ง์ ํด์ url์ ๋ง๋ค ๊ฒ!!
๊ทผ๋ฐ ์ด๊ฒ ์ง์ง ๋๋ฌด ์ด๋ ค์ ๋ค.... ๐ฅน
percentEncodedQuery๋ URLComponents์ ์ค์ ๋ ์ฟผ๋ฆฌ ์์ดํ ์ ๊ธฐ๋ฐ์ผ๋ก ํผ์ผํธ ์ธ์ฝ๋ฉ ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
์ด๋, +๋ ๊ณต๋ฐฑ์ ๋์ฒด ๋ฌธ์๋ก ํด์ ๋๊ธฐ ๋๋ฌธ์ ๋ณํ ๋์ง ์์ ๊ฒ.
๋ง์ง๋ง์ urlComponents.percentEncodedQuery = plusEncodedQuery๋ฅผ ํ ๋น ํด์ฃผ๋ ์ด์ ๋
์ธ์ฝ๋ฉ ๋ + ์ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ๋ค์ ํ ๋นํด์ค์ผํ๊ธฐ ๋๋ฌธ.
๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ๋ค์ด ์จ ๊ฒ์ ๋ณผ ์ ์๋ค....!!!
๋ ๋ฒ์งธ ์ด์...
๋ฌธ์ ํด๊ฒฐ2
iOS10๋ถํฐ๋ ATS(App Transport Security)๊ฐ ๊ฐํ๋์ด ๋ณด์์ด ์์ ํ์ง ์์ Https ํธ๋ํฝ์ ๋นํ์ฑํ ์ํจ๋ค๊ณ ํ๋ค.
Info.plist์์ ATS setting์ ์์ ํจ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค๊ณ ํ๋ค.
์ฌ๊ธฐ์ ์ง๋ฉดํ ๋ ๋ค๋ฅธ ๋ฌธ์
endpoint๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ค ํ๋๋ ํ์์ด ๋ค๋ฅธ url๋ค์ ์ฝ๊ฒ ๋ง๋ค๊ณ ๋คํธ์ํฌ๋งค๋์ ์์ ํ๋์ ๋ฉ์๋๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ด์ ๋ ์๋ค. ํ์ฌ ๋ค๋ฅธ API๋ค์ ์ ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๊ณ ์ค ์์ผ๋, ์ด ์๋น์ค ํค ํ๋๋ก ์ธํด์ ๋คํธ์ํฌ๋งค๋์ ์์ ์๋น์คํค๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌ ํด์ผํ๋ ์ํฉ์ด ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ ๋คํธ์ํฌ ์์ฒญ์ ๊ด๋ฆฌํ๋ NetworkManager์์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ ์ธ์ฝ๋ฉ๊น์ง ์ํํด์ผํ๋๊ฐ์ ๋ํ ์๋ฌธ์ด ๋ค๊ฒ ํ๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ ๋ฟ๋ง ์๋๋ผ ํค๋ ํ๋ผ๋ฏธํฐ๋ path ๋ฑ์๋ ์ด๋ฌํ ์ํฉ์ด ๋ฐ์ํ๋ค๋ฉด,,,?
ํ์ฌ ๋คํธ์ํฌ ๋งค๋์ ์์ ์ฒ๋ฆฌํ๊ธฐ์๋ ์ฑ ์์ ์์ด ๋ชจํธํด์ง์ง ์์๊น๋ผ๋ ์๊ฐ์ด ๋ ๋ค.
๋ฌธ์ ํด๊ฒฐ3
์๋ํด ๋ณธ ๋ฐฉ๋ฒ์ extension์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
URLComponents๋ ๊ตฌ์กฐ์ฒด๋ก ์ธ์คํด์ค ๋ด์์ ์์ฑ์ ์์ ํ๋ ค๋ฉด mutating ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ์์ฑ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
-> self.perenteEncodedQuery ๊ฐ์ ์์ ํ๊ณ ์๊ธฐ ๋๋ฌธ.
path๋ URLComponents์ ๋ค๋ฅธ ์์ฑ์๋ ์ธ์ฝ๋ฉ ๋ก์ง์ ์ถ๊ฐํ ์ ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ข ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋์ง ์์๋ด์ผํ ๊ฒ ๊ฐ๋ค.
Refence
- https://zeddios.tistory.com/1103