Jquery-как заработать $.post () use contentType=application / json?
Я заметил, что при использовании $.post() в jquery, что по умолчанию contentType-это application/x-www-form-urlencoded-when my asp.net код mvc должен иметь contentType=application / json
(см. Этот вопрос, почему я должен использовать application / json: ASPNET MVC - почему ModelState.IsValid false "поле x обязательно", когда это поле имеет значение?)
Как я могу заработать $.post () send contentType=application / json? У меня уже есть большое количество $.должность() функции, поэтому я не хочу менять на $.ajax () потому что это займет слишком много времени
Если я попробую
$.post(url, data, function(), "json")
он по-прежнему имеет contentType=application/x-www-form-urlencoded. Итак, что именно делает параметр "json", если он не изменяет contenttype на json?
Если я попробую
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
это работает, но влияет на каждый$.получать и.$ сообщение, которое у меня есть и заставляет некоторых ломаться.
Так есть ли способ, что я могу изменить поведение $.post () для отправки contentType=application/json?
15 ответов:
Я думаю, что вы, возможно, придется
1.Измените источник, чтобы сделать $.post всегда использует тип данных JSON, поскольку это действительно просто ярлык для предварительно настроенного
$.ajaxвызовили
или
3.Вы можете перезаписать
$.post functionС вашей собственной реализацией через исправление обезьян.В Тип данных JSON в вашем примере ссылается на возвращаемый тип данных С сервер, а не формат отправлено на сервер.
$.ajax({ url:url, type:"POST", data:data, contentType:"application/json; charset=utf-8", dataType:"json", success: function(){ ... } })посмотреть : jQuery.ajax ()
наконец я нашел решение, которое работает для меня:
jQuery.ajax ({ url: myurl, type: "POST", data: JSON.stringify({data:"test"}), dataType: "json", contentType: "application/json; charset=utf-8", success: function(){ // } });
Я закончил тем, что добавил следующий метод в jQuery в моем скрипте:
jQuery["postJSON"] = function( url, data, callback ) { // shift arguments if data argument was omitted if ( jQuery.isFunction( data ) ) { callback = data; data = undefined; } return jQuery.ajax({ url: url, type: "POST", contentType:"application/json; charset=utf-8", dataType: "json", data: data, success: callback }); };и использовать его
$.postJSON('http://url', {data: 'goes', here: 'yey'}, function (data, status, xhr) { alert('Nailed it!') });Это было сделано путем простого копирования кода "get" и "post" из исходных источников JQuery и жесткого кодирования нескольких параметров для принудительного сообщения JSON.
спасибо!
использовать просто
jQuery.ajax ({ url: myurl, type: "POST", data: mydata, dataType: "json", contentType: "application/json; charset=utf-8", success: function(){ // } });обновлено @JK: если вы пишете в своем вопросе только один пример кода С $.после вы найдете один соответствующий пример в ответ. Я не хочу повторять ту же информацию, которую вы уже изучили, пока не узнаете: $.почта и.$ получить короткие формы $.Аякс. Так что просто используйте $.AJAX и вы можете использовать полный набор параметров, без изменения каких-либо глобальных настроек.
кстати я бы не рекомендовал перезапись стандартного $.должность. Это мое личное мнение, но для меня важно не только то, что программа работает, но и то, что все, кто читает вашу программу, понимают ее одинаково. Перезапись стандартными методами не имея очень важной причины на непонимание в чтение программы Код. Поэтому я повторяю свою рекомендацию еще раз: просто используйте исходный $.ajax форма jQuery вместо
jQuery.getиjQuery.postи вы получаете программы, которые не только отлично работают, но и могут быть прочитаны людьми без каких-либо недоразумений.
тип данных "json", который вы можете передать в качестве последнего параметра post (), указывает, какой тип данных функция ожидает в ответе сервера, а не какой тип он отправляет в запросе. В частности, он устанавливает заголовок "Accept".
честно говоря, лучше всего переключиться на вызов ajax (). Функция post() предназначена для удобства; упрощенная версия вызова ajax (), когда вы просто выполняете простую форму публикации. Это не так.
Если вы действительно не хотите переключаться, вы можете сделать свою собственную функцию, например, xpost (), и просто преобразовать заданные параметры в параметры для вызова jQuery ajax() с набором типов контента. Таким образом, вместо того, чтобы переписывать все эти функции post() в функции ajax (), вам просто нужно изменить их все с post на xpost (или что-то еще).
Я знаю, что это поздний ответ, я на самом деле есть ускоренный метод, который я использую для размещения/чтения в/из MS-услуг.. он работает с MVC, а также ASMX и т. д...
использование:
$.msajax( '/services/someservice.asmx/SomeMethod' ,{} /*empty object for nothing, or object to send as Application/JSON */ ,function(data,jqXHR) { //use the data from the response. } ,function(err,jqXHR) { //additional error handling. } );//sends a json request to an ASMX or WCF service configured to reply to JSON requests. (function ($) { var tries = 0; //IE9 seems to error out the first ajax call sometimes... will retry up to 5 times $.msajax = function (url, data, onSuccess, onError) { return $.ajax({ 'type': "POST" , 'url': url , 'contentType': "application/json" , 'dataType': "json" , 'data': typeof data == "string" ? data : JSON.stringify(data || {}) ,beforeSend: function(jqXHR) { jqXHR.setRequestHeader("X-MicrosoftAjax","Delta=true"); } , 'complete': function(jqXHR, textStatus) { handleResponse(jqXHR, textStatus, onSuccess, onError, function(){ setTimeout(function(){ $.msajax(url, data, onSuccess, onError); }, 100 * tries); //try again }); } }); } $.msajax.defaultErrorMessage = "Error retreiving data."; function logError(err, errorHandler, jqXHR) { tries = 0; //reset counter - handling error response //normalize error message if (typeof err == "string") err = { 'Message': err }; if (console && console.debug && console.dir) { console.debug("ERROR processing jQuery.msajax request."); console.dir({ 'details': { 'error': err, 'jqXHR':jqXHR } }); } try { errorHandler(err, jqXHR); } catch (e) {} return; } function handleResponse(jqXHR, textStatus, onSuccess, onError, onRetry) { var ret = null; var reterr = null; try { //error from jqXHR if (textStatus == "error") { var errmsg = $.msajax.defaultErrorMessage || "Error retreiving data."; //check for error response from the server if (jqXHR.status >= 300 && jqXHR.status < 600) { return logError( jqXHR.statusText || msg, onError, jqXHR); } if (tries++ < 5) return onRetry(); return logError( msg, onError, jqXHR); } //not an error response, reset try counter tries = 0; //check for a redirect from server (usually authentication token expiration). if (jqXHR.responseText.indexOf("|pageRedirect||") > 0) { location.href = decodeURIComponent(jqXHR.responseText.split("|pageRedirect||")[1].split("|")[0]).split('?')[0]; return; } //parse response using ajax enabled parser (if available) ret = ((JSON && JSON.parseAjax) || $.parseJSON)(jqXHR.responseText); //invalid response if (!ret) throw jqXHR.responseText; // d property wrap as of .Net 3.5 if (ret.d) ret = ret.d; //has an error reterr = (ret && (ret.error || ret.Error)) || null; //specifically returned an "error" if (ret && ret.ExceptionType) { //Microsoft Webservice Exception Response reterr = ret } } catch (err) { reterr = { 'Message': $.msajax.defaultErrorMessage || "Error retreiving data." ,'debug': err } } //perform final logic outside try/catch, was catching error in onSuccess/onError callbacks if (reterr) { logError(reterr, onError, jqXHR); return; } onSuccess(ret, jqXHR); } } (jQuery));Примечание: у меня также есть JSON.метод parseAjax, модифицированный из json.org 's JS файл, который добавляет обработку для MS" / Date(...)/" финики...
модифицированный json2.JS файл не входит, он использует скрипт на основе парсера в случае IE8, так как есть экземпляры, в которых собственный синтаксический анализатор ломается при расширении прототипа массива и/или объекта и т. д.
Я рассматривал возможность обновления этого кода для реализации интерфейсов promises, но он работал очень хорошо для меня.
в основе дела лежит тот факт, что JQuery на момент написания не имеет метода postJSON, в то время как getJSON существует и делает все правильно.
метод postJSON будет делать следующее:
postJSON = function(url,data){ return $.ajax({url:url,data:JSON.stringify(data),type:'POST', contentType:'application/json'}); };и может использоваться следующим образом:
postJSON( 'path/to/server', my_JS_Object_or_Array ) .done(function (data) { //do something useful with server returned data console.log(data); }) .fail(function (response, status) { //handle error response }) .always(function(){ //do something useful in either case //like remove the spinner });
Это простое расширение API jquery (от:https://benjamin-schweizer.de/jquerypostjson.html) за $.postJSON () делает трюк. Вы можете использовать postJSON() как и любой другой собственный вызов jQuery Ajax. Вы можете прикрепить обработчики событий и так далее.
$.postJSON = function(url, data, callback) { return jQuery.ajax({ 'type': 'POST', 'url': url, 'contentType': 'application/json; charset=utf-8', 'data': JSON.stringify(data), 'dataType': 'json', 'success': callback }); };Как и другие API Ajax (например, $http от AngularJS), он устанавливает правильный contentType в application/json. Вы можете передать свои данные json (объекты javascript) напрямую, так как они здесь строятся. Ожидаемое возвращаемый тип данных имеет значение JSON. Вы можете прикрепить обработчики событий по умолчанию jquery для обещаний, например:
$.postJSON(apiURL, jsonData) .fail(function(res) { console.error(res.responseText); }) .always(function() { console.log("FINISHED ajax post, hide the loading throbber"); });
Как насчет вашего собственного адаптера/фантик ?
//adapter.js var adapter = (function() { return { post: function (url, params) { adapter.ajax(url, "post", params); }, get: function (url, params) { adapter.ajax(url, "get", params); }, put: function (url, params) { adapter.ajax(url, "put", params); }, delete: function (url, params) { adapter.ajax(url, "delete", params); }, ajax: function (url, type, params) { var ajaxOptions = { type: type.toUpperCase(), url: url, success: function (data, status) { var msgType = ""; // checkStatus here if you haven't include data.success = true in your // response object if ((params.checkStatus && status) || (data.success && data.success == true)) { msgType = "success"; params.onSuccess && params.onSuccess(data); } else { msgType = "danger"; params.onError && params.onError(data); } }, error: function (xhr) { params.onXHRError && params.onXHRError(); //api.showNotificationWindow(xhr.statusText, "danger"); } }; if (params.data) ajaxOptions.data = params.data; if (api.isJSON(params.data)) { ajaxOptions.contentType = "application/json; charset=utf-8"; ajaxOptions.dataType = "json"; } $.ajax($.extend(ajaxOptions, params.options)); } })(); //api.js var api = { return { isJSON: function (json) { try { var o = JSON.parse(json); if (o && typeof o === "object" && o !== null) return true; } catch (e) {} return false; } } })();и очень простое использование:
adapter.post("where/to/go", { data: JSON.stringify(params), onSuccess: function (data) { //on success response... } //, onError: function(data) { //on error response... } //, onXHRError: function(xhr) { //on XHR error response... } });
The документация в настоящее время показывает, что по состоянию на 3.0, $.post примет объект настроек, что означает, что вы можете использовать $.параметры ajax. 3.0 еще не вышел и на совершение Они говорят о сокрытии ссылки на него в документах, но ищите его в будущем!
у меня была аналогичная проблема со следующим кодом JavaScript:
var url = 'http://my-host-name.com/api/Rating'; var rating = { value: 5, maxValue: 10 }; $.post(url, JSON.stringify(rating), showSavedNotification);, где в Саша Я видел запрос:
:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8- Body:
{"value":"5","maxValue":"5"}в результате мой сервер не смог сопоставить объект с типом на стороне сервера.
после изменения последней строки такой:
$.post(url, rating, showSavedNotification);в скрипаче я все еще видел:
:
сервер начал возвращать то, что я ожидал.Content-Type: application/x-www-form-urlencoded; charset=UTF-8- Body:
value=5&maxValue=10
по какой-то причине установка типа контента в запросе ajax, как предложил @Adrien, не сработала в моем случае. Однако на самом деле вы можете изменить тип контента с помощью $.сообщение, сделав это раньше:
$.ajaxSetup({ 'beforeSend' : function(xhr) { xhr.overrideMimeType('application/json; charset=utf-8'); }, });тогда сделайте свой
$.postзвоните:$.post(url, data, function(), "json")у меня были проблемы с jQuery + IIS, и это было единственное решение, которое помогло jQuery понять, как использовать кодировку windows-1252 для запросов ajax.
мы можем изменить тип контента, как это в $.пост
$.пост(URL-адрес,данные, функция (данных, состояния, то XHR) { то XHR.setRequestHeader ("Content-type", "application/x-www-form-urlencoded; charset=utf-8");});
вы не можете отправить
application/jsonнепосредственно -- это должен быть параметр запроса GET/POST.что-то вроде
$.post(url, {json: "...json..."}, function());
Comments