Экранирующая последовательность для URI определена в разделе 2.4.1 RFC2396 (унифицированные идентификаторы ресурса):
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 также определяет зарезервированные символы для компонента path
в разделе 3.3 :
Within a path segment, the characters "/", ";", "=", and "?" are reserved.
Так что вам нужно использовать encodeURIComponent () , поскольку escape()
устарел устарел и encodeURI()
не экранирует все зарезервированные символы , которые необходимо экранировать в соответствии с приведенным выше отрывком RFC.
В приведенном ниже примере показано, что только encodeURIComponent()
правильно экранирует косые черты (это символы, которые наиболее вероятно вызывают проблемы, с которыми вы сталкиваетесь):
>>> escape('//');
"//"
>>> encodeURI('//');
"//"
>>> encodeURIComponent('//');
"%2F%2F"
Однако обратите внимание, что если возможно, вы должны использовать POST вместо GET . Это правильный метод для использования в REST (и в целом), поскольку вы отправляете данные с клиента на сервер (POST), а не получаете их с сервера (GET).
Использование POST также позволит вам избежать дополнительной проблемы. Поскольку длина URI ограничена на обычных веб-серверах, рано или поздно вы столкнетесь с запросом с очень длинным URI, который либо урезается, либо выдает ошибку. Переключение на POST позволит вам поддерживать чистоту URI и сохранять данные в теле сообщения вместо URI. См. ответы на этот вопрос для получения подробной информации об ограничениях длины URI.