Как отправить JSON вместо строки запроса с $ .ajax?

Может ли кто-нибудь объяснить простым способом, как сделать jQuery отправлять фактический JSON вместо строки запроса?

$.ajax({ url : url, dataType : 'json', // I was pretty sure this would do the trick data : data, type : 'POST', complete : callback // etc }); 

Это фактически преобразует ваш тщательно подготовленный JSON в строку запроса. Одна из неприятных вещей заключается в том, что любой array: [] в вашем объекте будет преобразован в array[]: [] , вероятно, из-за ограничений запроса.

Вам нужно использовать JSON.stringify для первого сериализации вашего объекта в JSON, а затем указать contentType чтобы ваш сервер понял, что это JSON. Это должно сделать трюк:

 $.ajax({ url: url, type: "POST", data: JSON.stringify(data), contentType: "application/json", complete: callback }); 

Обратите внимание, что объект JSON изначально доступен в браузерах, поддерживающих JavaScript 1.7 / ECMAScript 5 или новее. Если вам нужна устаревшая поддержка, вы можете использовать json2 .


Эти дополнительные данные изначально были неверно включены в предыдущую ревизию вопроса. Они были скопированы в этот принятый ответ.

Обратите внимание, что для этого требуются правильные заголовки CORS на стороне сервера, и, вопреки некоторым примерам в сети, Allow-Headers не могут использовать подстановочные знаки (в то время как Allow-Origin может).

 { Content-Type : 'application/json', Access-Control-Allow-Origin : '*', Access-Control-Allow-Headers : 'Content-Type' // You cannot use '*' } 

Также обратите внимание, что jQuery теперь отправит два запроса, один для завершения рукопожатия и один с фактическим содержимым. Это обычное поведение HTTP, называемое предполетным . Первый запрос будет заголовком OPTIONS , чтобы определить, действительно ли сервер совместим с запланированным запросом.

Поэтому имейте в виду, если вы хотите, чтобы ваш сервер был универсальным, строка запроса отправляет только один запрос. Используя true JSON отправляет по крайней мере два запроса, один для рукопожатия.

Нет, параметр dataType предназначен для анализа полученных данных.

Чтобы опубликовать JSON, вам нужно будет скомпилировать его самостоятельно через JSON.stringify и установить для параметра processData значение false .

 $.ajax({ url: url, type: "POST", data: JSON.stringify(data), processData: false, contentType: "application/json; charset=UTF-8", complete: callback }); 

Обратите внимание, что не все браузеры поддерживают JSON объект, и хотя jQuery имеет .parseJSON , он не содержит ни одного строкомера; вам понадобится еще одна полиполная библиотека.

Хотя я знаю, что многие архитектуры, такие как ASP.NET MVC, имеют встроенные функции для обработки JSON.stringify как contentType, моя ситуация немного отличается, поэтому, возможно, это может помочь кому-то в будущем. Я знаю, что это спасло бы меня!

Поскольку мои HTTP-запросы обрабатываются CGI-API из IBM (среда AS400) в разных субдоменах, эти запросы являются перекрестными, поэтому jsonp. Я действительно отправляю свой ajax через javascript-объекты. Вот пример моего ajax POST:

  var data = {USER : localProfile, INSTANCE : "HTHACKNEY", PAGE : $('select[name="PAGE"]').val(), TITLE : $("input[name='TITLE']").val(), HTML : html, STARTDATE : $("input[name='STARTDATE']").val(), ENDDATE : $("input[name='ENDDATE']").val(), ARCHIVE : $("input[name='ARCHIVE']").val(), ACTIVE : $("input[name='ACTIVE']").val(), URGENT : $("input[name='URGENT']").val(), AUTHLST : authStr}; //console.log(data); $.ajax({ type: "POST", url: "http://www.domian.com/webservicepgm?callback=?", data: data, dataType:'jsonp' }). done(function(data){ //handle data.WHATEVER }); 

Если вы отправляете это обратно в asp.net и нуждаетесь в данных в request.form [], вам нужно установить тип содержимого «application / x-www-form-urlencoded; charset = utf-8»,

Оригинальный пост здесь

Во-вторых, избавиться от типа данных, если вы не ожидаете возврата, POST будет ждать около 4 минут до сбоя. См. Здесь

Давайте будем гением компьютера.