URLComponentsは、`+`をPercent Encodingしてくれない
経緯
APIを叩く際にランダムに生成しな内容をBASE64化してQueryにつけて送信しようとしていたが、5割ぐらいのエラーになっていた。
調査した結果、+がPercent Encodingされていないためだったが、なぜこんなことが起きたのか…。
便利なURLComponentsの罠
この記事でURLComponentsという便利なものがある!自前でPercent EncodingしてQuery作らなくていいんだ!とうっきうきで使っていたわけだが、+はPercent Encodingしてくれない。(ちなみに+をPercent Encodingすると%2Bになる)
なぜ起こったか
今回のようなことが何故起こったのか。
URLComponentsは、説明にRFC 3986に準拠していると記載されている。サーバ側がRFC 3986に準拠していない作りが理由とも言えるし、自分がそこを確認怠り、URLComponentsを使用したのが理由とも言える。
URLComponents - Foundation | Apple Developer Documentation
サーバの作り次第で、このあたりはいくらでも変わるので、気をつけたいところ。
今回は、時間やコードの手戻りが厳しいこともありURLComponentsでQueryを付けた後、+を%2Bに置換する力技で解決した。
URLComponentsに頼らない自作URLComponentsのようなものを作ってもいいかもしれないと思った。