はRFC2396(ユニフォームリソース識別子)のsection 2.4.1で定義されている:だから
Within a path segment, the characters "/", ";", "=", and "?" are reserved.
:
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はまたsection 3.3でpath
コンポーネントの予約文字を定義しますescape()
がdeprecatedとencodeURI()
であるため、encodeURIComponent()を使用する必要があります上記のRFCの抜粋に従ってエスケープする必要があります。
次の例では、唯一のencodeURIComponent()
が(これらはほとんどの場合、あなたが直面している問題を起こす文字である)適切にスラッシュをエスケープしていることを示しています
>>> escape('//');
"//"
>>> encodeURI('//');
"//"
>>> encodeURIComponent('//');
"%2F%2F"
ただし、可能な場合、あなたは使用する必要があることに注意してください。 GETの代わりにPOST。サーバー(GET)から取得するのではなく、クライアントからサーバー(POST)にデータを送信するときに、REST(および一般的に)で使用する正しい方法です。
POSTを使用すると、追加の問題を回避することもできます。 URIの長さは一般的なWebサーバでは制限されているので、遅かれ早かれ、非常に長いURIを持つリクエストが発生します。リクエストはトリミングされるか、エラーをスローされます。 POSTに切り替えると、URIをきれいに保ち、URIの代わりにメッセージの本文にデータを保持できます。 URIの長さ制限の詳細については、answers to this questionを参照してください。
詳細な回答をいただきありがとうございます。問題のある文字は何かを見つけようとし、たぶんそれらを削除します。私はJSONPで働いているので難しい投稿に移動することはできません – Amnon
ああ、私は(JSONP)を参照してください。後でURIを再構成する必要がない場合は、文字を削除することはもちろん便利です。ただし、APIで許可されている場合は、パスのコンポーネントからクエリ文字列にパラメータを移動することを検討してください。これは、URIの長さの制限を避けるのに役立ちます。 -/ クエリ文字列の代わりに独自のクエリパラメータを持つ{location}値として 'encodeURIComponent()'が必要であることに注意してください要求が破棄される可能性があります(現在と同じ理由により)。 – MicE
クエリ文字列に関してヒントをいただきありがとうございます。特定の文字で開始したくないため、locationパラメータにbase64を使用しました。 – Amnon