Я заметил, что при использовании $ .post () в jquery по умолчанию contentType является application / x-www-form-urlencoded - когда мой код mvc asp.net должен иметь contentType = application / json
(См. Этот вопрос, чтобы узнать, почему я должен использовать application / json: ASPNET MVC. Почему ModelState.IsValid имеет значение «Поле x обязательно», если это поле имеет значение? )
Как я могу заставить $ .post () отправлять contentType = application / json? У меня уже есть большое количество функций $ .post (), поэтому я не хочу переходить на $ .ajax (), потому что это займет слишком много времени
Если я попробую
$.post(url, data, function(), "json")
Он все еще имеет contentType = application / x-www-form-urlencoded. Так что именно делает параметр "json", если он не меняет тип содержимого на json?
Если я попробую
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
Это работает, но влияет на все мои $ .get и $ .post, которые у меня есть, и вызывает некоторые из них.
Так есть ли способ изменить поведение $ .post () для отправки contentType = application / json?
jQuery.post
метода перезаписи , это действительно простая функция ..."mystring data"
будетapplication/x-www-form-urlencoded;
где как объект{ anyKey: "anyvalue and type" }
будетapplication/json
. Многие серверы, которые читают json, допускают только объект или массив, а не строку - поэтому jquery предсказывает вещи таким образом. Если у вас есть сервер, который читает строки, числа и т. Д., Не заключая их в объект, вы должны указать тип содержимого, как в этом ответе.Смотрите: jQuery.ajax ()
источник
JSON.stringify(data)
, так как сервер ожидает, что строка JSON и jQuery просто объединят пары ключ-значение с помощью амперсандов в форме urlencoded.Наконец я нашел решение, которое работает для меня:
источник
data
аргументx-www-form-urlencoded
, но если вы укажете, что тип содержимого запроса - JSON, он по-прежнему настаивает на отправкеdata
в несоответствующем формате.В итоге я добавил следующий метод в jQuery в моем скрипте:
И использовать это
Это было сделано простым копированием кода «get» и «post» из исходных источников JQuery и жестким кодированием нескольких параметров для принудительного создания JSON POST.
Спасибо!
источник
использовать только
ОБНОВЛЕНО @JK: Если вы напишите в своем вопросе только один пример кода с $ .post, вы найдете один соответствующий пример в ответе. Я не хочу повторять ту же информацию, которую вы уже изучили, пока не узнали: $ .post и $ .get - это короткие формы $ .ajax. Так что просто используйте $ .ajax, и вы можете использовать полный набор его параметров без необходимости изменения каких-либо глобальных настроек.
Кстати, я бы не рекомендовал перезаписывать стандартный $ .post. Это мое личное мнение , но для меня важно не только то, что программа работает, но и то, что все, кто читает вашу программу, понимают ее одинаково. Перезапись стандартных методов без очень важной причины может привести к недоразумению при чтении программного кода. Поэтому я повторяю свою рекомендацию еще раз: просто используйте оригинальную форму $ .ajax jQuery вместо
jQuery.get
и,jQuery.post
и вы получите программы, которые не только отлично работают, но и могут быть прочитаны людьми без каких-либо недоразумений.источник
Тип данных "json", который вы можете передать в качестве последнего параметра функции post (), указывает, какой тип данных ожидает функция в ответе сервера, а не какой тип она отправляет в запросе. В частности, он устанавливает заголовок «Принять».
Честно говоря, ваш лучший выбор - переключиться на вызов ajax (). Функция post () предназначена для удобства; упрощенная версия вызова ajax () для простой публикации формы. Вы нет.
Если вы действительно не хотите переключаться, вы можете создать свою собственную функцию, скажем, xpost (), и сделать так, чтобы она просто преобразовывала заданные параметры в параметры для вызова jQuery ajax () с установленным типом содержимого. Таким образом, вместо того, чтобы переписывать все эти функции post () в функции ajax (), вам просто нужно изменить их все с post на xpost (или как угодно).
источник
Это простое расширение jquery API (от: https://benjamin-schweizer.de/jquerypostjson.html ) для $ .postJSON () делает свое дело. Вы можете использовать postJSON (), как и любой другой нативный вызов jquery Ajax. Вы можете прикрепить обработчики событий и так далее.
Как и другие API Ajax (например, $ http от AngularJS), он устанавливает правильный тип содержимого для application / json. Вы можете передавать свои данные json (объекты javascript) напрямую, так как они здесь становятся строковыми. Ожидаемый возвращенный dataType установлен в JSON. Вы можете прикрепить обработчики событий jquery по умолчанию для обещаний, например:
источник
Я знаю, что это поздний ответ, у меня на самом деле есть ярлык, который я использую для публикации / чтения в / из служб на базе MS ... он работает с MVC, а также с ASMX и т. Д.
Использование:
ПРИМЕЧАНИЕ: у меня также есть метод JSON.parseAjax, который изменен из файла JS json.org, который добавляет обработку для дат "/Date(...)/" MS ...
Измененный файл json2.js не включен, он использует синтаксический анализатор на основе сценариев в случае IE8, поскольку существуют случаи, когда собственный синтаксический анализатор прерывается при расширении прототипа массива и / или объекта и т. Д.
Я собирался обновить этот код для реализации интерфейсов обещаний, но он мне очень помог.
источник
В основе всего этого лежит тот факт, что JQuery на момент написания статьи не имеет метода postJSON, а getJSON существует и работает правильно.
метод postJSON будет делать следующее:
и может быть использовано так:
источник
В настоящее время документация показывает, что начиная с версии 3.0, $ .post будет принимать объект настроек, что означает, что вы можете использовать опции $ .ajax. 3.0 еще не выпущен, и в коммите, о котором они говорят, скрывают ссылку на него в документации, но ищите его в будущем!
источник
У меня была похожая проблема со следующим кодом JavaScript:
Где в Fiddler я мог видеть запрос с:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
В результате мой сервер не смог сопоставить объект типу серверной части.
После изменения последней строки на эту:
В Скрипаче я все еще мог видеть:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
Однако сервер начал возвращать то, что я ожидал.
источник
Как насчет вашего собственного адаптера / оболочки?
И чрезвычайно простое использование:
источник
По какой-то причине установка типа контента в запросе ajax, как предложил @Adrien, в моем случае не сработала. Однако вы можете изменить тип содержимого, используя $ .post, выполнив это раньше:
Тогда сделайте ваш
$.post
звонок:У меня были проблемы с jQuery + IIS, и это было единственное решение, которое помогло jQuery понять использование кодировки windows-1252 для запросов ajax.
источник
мы можем изменить Content-type следующим образом в $ .post
$ .post (url, data, function (data, status, xhr) {xhr.setRequestHeader ("Content-type", "application / x-www-form-urlencoded; charset = utf-8");});
источник
$ .post не работает, если у вас есть проблема с CORS (Cross Origin Resource Sharing). Попробуйте использовать $ .Ajax в следующем формате: "$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, заголовки: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', тип: 'POST', async: false, success: function (Data) {...}}); "
источник
Вы не можете отправить
application/json
напрямую - это должен быть параметр запроса GET / POST.Так что-то вроде
источник