Как отправить 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[]: []
Возможно, из-за ограничений строки запроса.
4 ответа
Вам нужно использовать JSON.stringify
to first serialize your object to JSON, and then specify the contentType
so your server understands it's JSON. Это должно сделать трюк:
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
contentType: "application/json",
complete: callback
});
Обратите внимание, что JSON
object is natively available in browsers that support JavaScript 1.7 / ECMAScript 5 or later. If you need legacy support you can use json2.
Нет, 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
, в него не включен строковый преобразователь; вам понадобится еще одна библиотека polyfill.
Хотя я знаю, что многие архитектуры, такие как 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"
Оригинальный пост здесь
Во-вторых, избавьтесь от Datatype, если вы не ожидаете возврата, POST будет ждать около 4 минут, прежде чем потерпит неудачу. Смотрите здесь