JQuery - Kaip padaryti $ .post () naudojimą contentType = application / json?

Pastebėjau, kad naudojant $ .post () jquery, numatytasis turinio tipas yra application / x-www-form-urlencoded - kai mano mvc asp.net kodas turėtų turėti contentType = application / json

(žr. šį klausimą, kodėl turėčiau naudoti programą „ Json : ASPNET MVC“ - kodėl „ModelState.IsValid“ klaidingas „laukas x reikalingas“, kada šis laukas yra svarbus? )

Kaip galiu padaryti $ .post () siųsti contentType = application / json? Aš jau turiu daug $ .post () funkcijų, todėl nenoriu pakeisti $ .ajax () vertės, nes tai užtruks per ilgai

Jei bandau

 $.post(url, data, function(), "json") 

Jis vis dar turi contentType = application / x-www-form-urlencoded. Taigi, ką daro „json“ parametras, jei jis nepakeičia turinio tipo „Json“?

Jei bandau

 $.ajaxSetup({ contentType: "application/json; charset=utf-8" }); 

Tai veikia, bet veikia visus $ .get ir $ .post, kuriuos turiu, ir sukelia kai kuriuos sutrikimus.

Taigi, ar yra būdas pakeisti $ .post () elgesį, kad išsiųstumėte contentType = application / json?

260
nustatytas į JK. 2010-05-17 00:01 Gegužės 17 d. 10 val. 0:01 2010-05-17 00:01
@ 15 atsakymų

Manau, jums gali tekti

1. Pakeiskite šaltinį taip, kad $ .post visada naudotų JSON duomenų tipą, nes tai yra iš anksto sukonfigūruoto $.ajax

Or

2. Nustatykite savo naudingumo funkciją, kuri yra nuoroda į $.ajax konfigūraciją, kurią norite naudoti

arba

3. Jūs galite perrašyti $.post function savo beždžionės pleistru.

JSON duomenų tipas jūsų pavyzdyje reiškia duomenų tipą, kuris grąžinamas iš serverio, o ne formatu, siunčiamu į serverį.

61
17 мая '10 в 0:05 2010-05-17 00:05 atsakymas pateikiamas Russ Cam gegužės 17 d., 10 val
 $.ajax({ url:url, type:"POST", data:data, contentType:"application/json; charset=utf-8", dataType:"json", success: function(){ ... } }) 
border=0

Žr .: jQuery.ajax ()

346
17 мая '10 в 0:09 2010-05-17 00:09 atsakymas pateikiamas Adrien'o gegužės 17 d., 10 val. 0:09 2010-05-17 00:09

Galiausiai radau sprendimą, kuris veikia man:

 jQuery.ajax ({ url: myurl, type: "POST", data: JSON.stringify({data:"test"}), dataType: "json", contentType: "application/json; charset=utf-8", success: function(){ // } }); 
68
26 янв. atsakymas pateikiamas vvkatwss vvkatwss 26 sausio. 2012-01-26 17:46 '12 at 5:46 pm 2012-01-26 17:46

Dėl to prie scenarijaus pridėjau šį „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 }); }; 

Ir naudokite jį

 $.postJSON('http://url', {data: 'goes', here: 'yey'}, function (data, status, xhr) { alert('Nailed it!') }); 

Tai buvo padaryta paprasčiausiai nukopijuojant kodą iš „get“ ir „post“ iš originalių „jQuery“ šaltinių ir sunkiai koduojant kelis parametrus, kad priverstumėte JSON POST.

Ačiū!

35
26 июня '13 в 11:01 2013-06-26 11:01 atsakymas pateikiamas kontinuityvumu birželio 26 d. 13 val. 11:01 2013-06-26 11:01

naudoti tik

 jQuery.ajax ({ url: myurl, type: "POST", data: mydata, dataType: "json", contentType: "application/json; charset=utf-8", success: function(){ // } }); 

UPDATED @JK: jei rašote tik vieną kodo su $ .post pavyzdžiu, atsakyme rasite atitinkamą pavyzdį. Nenoriu pakartoti tos pačios informacijos, kurią jau išmokote, kol išmoksite: $ .post ir $ .get yra trumpos formos $ .ajax. Taigi tiesiog naudokite $ .ajax, ir jūs galite naudoti visas parinkčių rinkinys nekeisdami bendrųjų nustatymų.

Beje, nerekomenduočiau perrašyti standartinio $ .post. Tai mano asmeninė nuomonė, bet man svarbu ne tik tai, kad programa veikia, bet ir tai, kad kiekvienas, kuris skaito jūsų programą, jį supranta taip pat. Standartinių metodų perrašymas be rimtos priežasties gali būti nesusipratimas, kai skaitote programos kodą. Todėl dar kartą pakartoju savo rekomendaciją: tiesiog naudokite originalią $ .ajax jQuery formą vietoj jQuery.get ir jQuery.post ir gausite programas, kurios ne tik puikiai veikia, bet ir gali jas perskaityti be jokių nesusipratimų.

20
17 мая '10 в 0:07 2010-05-17 00:07 atsakymas duotas Olegui gegužės 17 d., 10 val

„Json“ duomenų tipas, kurį galite perkelti į paskutinį parametrą (post), nurodo duomenų tipą, kurį funkcija tikisi serverio atsakyme, o ne tipą, kurį jis siunčia užklausoje. Visų pirma jame nustatoma antraštė „Priimti“.

Sąžiningai, geriausia pereiti prie „ajax“ () skambučio. Post () funkcija skirta patogumui; Supaprastinta „ajax“ () skambučio versija, kai tiesiog publikuojate paprastą formą. Jūs nesate.

Jei tikrai nenorite perjungti, galite sukurti savo funkciją, pavadintą „xpost“ (), ir tiesiog konvertuoti nurodytus parametrus į parametrus, kad skambintumėte jQuery ajax () su turinio tipu. Taigi vietoj to, kad perrašyti visas pašto () funkcijas „ajax“ () funkcijoje, jums tereikia juos visus pakeisti iš įrašo į „xpost“ (ar kažką kitą).

8
17 мая '10 в 0:14 2010-05-17 00:14 atsakymą pateikė Jokūbo Mattisonas gegužės 17 d., 10 d., 0:14, 2010-05-17 00:14

Žinau, kad tai yra pavėluotas atsakymas. Aš iš tikrųjų turiu nuorodos metodą, kurį naudoju skelbti / skaityti / gauti iš MS teikiamų paslaugų. Jis veikia su MVC, taip pat su ASMX ir kt.

Naudoti:

 $.msajax( '/services/someservice.asmx/SomeMethod' ,{}  ,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)); 

PASTABA. Aš taip pat turiu JSON.parseAjax metodą, kuris buvo pakeistas iš js json.org failo, kuris prideda apdorojimo MS "/Date(...)/" datas ...

Pakeistas json2.js failas neįtrauktas, jis naudoja scenarijų analizę IE8 atveju, nes yra atvejų, kai gimtoji analizatorius sugenda, kai prototipo masyvas ir / ar objektas yra išplėstas ir tt

Aš apsvarstiau galimybę atnaujinti šį kodą, kad būtų įgyvendintos pažadų sąsajos, bet man tai labai gerai.

5
28 марта '12 в 2:24 2012-03-28 02:24 atsakymas duotas Tracker1 Kovo 28 d., 12 d., 2:24 am 2012-03-28 02:24

Šio klausimo esmė yra tai, kad jQuery rašymo metu neturi metodo „postJSON“, o getJSON egzistuoja ir veikia teisingai.

PostJSON metodas atliks šiuos veiksmus:

 postJSON = function(url,data){ return $.ajax({url:url,data:JSON.stringify(data),type:'POST', contentType:'application/json'}); }; 

ir gali būti naudojami taip:

 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 }); 
2
22 мая '14 в 22:22 2014-05-22 22:22 atsakymas pateikiamas dbrin gegužės 22, 14, 10:22 2014-05-22 22:22

Šis paprastas „Jquery API“ plėtinys (nuo: https://benjamin-schweizer.de/jquerypostjson.html ) už $ .postJSON () daro triuką. Galite naudoti postJSON (), kaip ir bet kurį kitą užsakymą „Ajax“ skambutį. Galite pridėti įvykių tvarkytojus ir pan.

 $.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 }); }; 

Kaip ir kitos „Ajax“ API (pvz., „$ Http“ iš „AngularJS“), ji nustato teisingą turinio tipo tipą „json“ programai. Json duomenis (javascript objektus) galite perkelti tiesiogiai, nes čia jis tampa eilute. Numatomas grąžinimo duomenų tipas nustatytas kaip JSON. Galite pridėti „Jquery“ numatytus įvykių tvarkytojus pažadams, pavyzdžiui:

 $.postJSON(apiURL, jsonData) .fail(function(res) { console.error(res.responseText); }) .always(function() { console.log("FINISHED ajax post, hide the loading throbber"); }); 
2
18 апр. Ruwen atsakymas, pateiktas balandžio 18 d 2018-04-18 08:40 '18 8:40 am 2018-04-18 08:40
0
13 марта '15 в 4:43 2015-03-13 04:43 Ben Creasy atsakymas kovo 13 d., 15 d., 4:43 2015-03-13 04:43

Turėjau panašią problemą su šiuo „JavaScript“ kodu:

 var url = 'http://my-host-name.com/api/Rating'; var rating = { value: 5, maxValue: 10 }; $.post(url, JSON.stringify(rating), showSavedNotification); 

Kur Fiddler galėjau matyti užklausą naudojant:

  • Pavadinimas: Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • Kūnas: {"value":"5","maxValue":"5"}

Todėl mano serveris negalėjo suderinti objekto su serverio pusės tipu.

Pakeitus paskutinę eilutę į:

 $.post(url, rating, showSavedNotification); 

Fiddler, aš vis dar galėjau pamatyti:

  • Pavadinimas: Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • Kūnas: value=5>

Tačiau serveris pradėjo grąžinti tai, ko tikėjausi.

0
21 нояб. atsakymas suteiktas Olegui Burovui 21 nov. 2016-11-21 02:20 '16 at 2:20 2016-11-21 02:20

Dėl tam tikros priežasties, turinio tipo nustatymas ajax užklausoje, kaip pasiūlė @Adrien, man nepadėjo. Tačiau iš tikrųjų galite pakeisti turinio tipą naudodami $ .post, tai atlikdami anksčiau:

 $.ajaxSetup({ 'beforeSend' : function(xhr) { xhr.overrideMimeType('application/json; charset=utf-8'); }, }); 

Tada skambinkite į $.post :

 $.post(url, data, function(), "json") 

Turėjau problemų su jQuery + IIS, ir tai buvo vienintelis sprendimas, padėjęs jQuery suprasti, kaip naudoti „windows-1252“ kodavimą ajax užklausoms.

0
27 февр. Johannes atsakė 27 vasario mėn. 2018-02-27 14:06 '18 at 2:06 pm 02/02/1927 14:06

galime pakeisti turinio tipą, kaip ir $ .post

$ .post (URL, duomenys, funkcija (duomenys, būsena, xhr) {xhr.setRequestHeader („Turinio tipas“, „taikymas / x-www-form-urlencoded; charset = utf-8“);});

0
16 авг. atsakymą pateikė Snziv Gupta 16 rug . 2018-08-16 05:02 '18 at 5:02 2018-08-16 05:02

Kaip apie savo adapterį / įvynioklį?

 //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; } } })(); 

Ir labai paprasta naudoti:

 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... } }); 
0
28 авг. atsakymą pateikė Blackening 28 rug . 2014-08-28 12:47 '14 at 12:47 2014-08-28 12:47

Jūs negalite tiesiogiai siųsti application/json - tai turi būti GET / POST užklausos parametras.

Taigi kažkas panašaus

 $.post(url, {json: "...json..."}, function()); 
-16
17 мая '10 в 0:06 2010-05-17 00:06 atsakė Amy B gegužės 17 d. 10 val. 0:06 2010-05-17 00:06

Kiti klausimai apie „ žymes arba Užduoti klausimą