URIのエスケープシーケンスは、RFC2396(Uniform Resource Identifiers)のセクション2.4.1で定義されています。
An escaped octet is encoded as a character triplet, consisting of the
percent character "%" followed by the two hexadecimal digits
representing the octet code. For example, "%20" is the escaped
encoding for the US-ASCII space character.
escaped = "%" hex hex
hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
"a" | "b" | "c" | "d" | "e" | "f"
このRFCは、セクション3.3path
でコンポーネントの予約文字も定義しています。
Within a path segment, the characters "/", ";", "=", and "?" are reserved.
したがって、 encodeURIComponent()を使用する必要があります。これescape()
は、非推奨であり、上記のRFCの抜粋に従ってエスケープする必要のあるencodeURI()
すべての予約文字をエスケープするわけではないためです。
以下の例は、スラッシュを適切にエスケープしているだけであることを示していencodeURIComponent()
ます(これらは、直面している問題を引き起こす可能性が最も高い文字です)。
>>> escape('//');
"//"
>>> encodeURI('//');
"//"
>>> encodeURIComponent('//');
"%2F%2F"
ただし、可能であれば、GETの代わりにPOSTを使用する必要があることに注意してください。これは、サーバーからデータを取得する(GET)のではなく、クライアントからサーバー(POST)にデータを送信するため、REST(および一般的に)で使用する正しい方法です。
POSTを使用すると、追加の問題を回避することもできます。一般的なWebサーバーではURIの長さが制限されているため、遅かれ早かれ、非常に長いURIのリクエストが発生し、トリミングされるか、エラーがスローされます。POSTに切り替えると、URIをクリーンに保ち、URIではなくメッセージの本文にデータを保持できるようになります。URIの長さ制限の詳細については、この質問への回答を参照してください。