Должны ли данные ajax-сообщения быть закодированы в URI?
Относительно этой строки:
var data = encodeURIComponent(JSON.stringify(object_literal));
Я не понимаю, почему это кодируется URI.
Более поздние данные будут отправлены через ajax POST
.
Я понимаю, что URL-адреса, особенно те, которые вы видите в адресной строке браузера, требуют специальных символов, как описано здесь:
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
Но что именно это связано с публикацией Ajax?
Как и адресная строка URL-адреса, так и внутренняя почта ajax используют тот же механизм?
Ответы
Ответ 1
Все зависит от типа содержимого .
Обычно, когда a <form>
использует POST-метод HTTP, значения формы URL Encoded и помещаются в тело запроса. Заголовок типа содержимого выглядит следующим образом:
content-type: application/x-www-form-urlencoded
Большинство библиотек AJAX будут делать это по умолчанию, поскольку они общеприняты среди веб-серверов. Однако нет ничего, что помешало бы вам просто серализовать данные как JSON или XML, а затем отправить его другим типом контента.
content-type: application/json
или
content-type: text/xml
Стоит отметить, что полезная нагрузка не имеет ничего общего с AJAX! Под капотом все они используют объект XmlHttpRequest для отправьте HTTP-запрос асинхронно на сервер. Не имеет значения, отправляете ли вы обычный текст, JSON, XML или даже необработанные двоичные данные, пока вы сообщаете серверу, как интерпретировать эти биты.
Кодирование URL-адресов является чисто историческим артефактом того, как элементы <form>
размещали свои данные на сервере до того, как AJAX был вокруг.
Ответ 2
Ответ Джоша хороший, но я думаю, что он что-то не хватает. Традиционно формировать данные было опубликовано в том же формате, что и запросы. например: param1=value1¶m2=value2
, и единственное различие между GET и POST заключается в том, что POST ставит эти параметры в тело сообщения, тогда как GET помещает их в URL-адрес. Однако очевидная проблема заключается в том, что если ваши имена или значения параметров включают в себя неэкранированные символы, такие как &
и =
, тогда вы сможете испортить способность сервера автоматически анализировать коллекцию параметров, что приводит к повреждению данных. Использование функции Javascript encodeURIComponent()
для каждого значения параметра приведет к удалению всех этих символов для вас.
Итак, нижняя строка: если вы не используете старую стандартную коллекцию параметров на стороне сервера - например, если вы разбираете JSON вместо этого - тогда нет необходимости кодировать URL-адрес. Кроме того, нет причин для кодирования URL-адресов, если вы не разбираете несколько параметров на стороне сервера, поэтому запуск encodeURIComponent
один раз на весь текст сообщения не имеет смысла.
Примечание: если вы используете asp.net и пытаетесь передать пользователям html на сервер, encodeURIComponent
позволит вам сделать это, не отключая проверку запроса, которая обычно запрещает это. Я не думаю, что отправить его как JSON, один, выполнит это.
Ответ 3
encodeURIComponent
- передавать переменные по ссылкам с помощью GET
JSON.stringify()
автоматически кодируется в utf8
только в некоторых редких случаях, например, когда вы хотите преобразовать странные charachters в base64, encodeURIComponent
используется вне GET.
вот пример
base64_encode=function(a){
return window.btoa(unescape(encodeURIComponent(a)));
};
https://developer.mozilla.org/en-US/docs/Web/API/window.btoa
сказал, что..
если вы используете REST API
сервис каждый ajax GET request
, который является строковым параметром, должен быть закодирован с помощью encodeURIComponent
.
вот пример использования yql
fooobar.com/questions/489839/...
Ответ 4
Нет, они этого не делают. Это не нужно, когда он отправляется в виде данных через Ajax
POST.
Вы можете отправить чистый JSON без использования AJAX
var ajaxObject = $.ajax({
url: 'url',
type: 'POST',
data: JSON.stringify(object_literal);
});