Должны ли данные 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&param2=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);
});