JQuery - How to make $ .post () contentType = proqram / json istifadə?

Jquery'de $ .post () istifadə edərkən, default contentType tətbiq / x-www-form-urlencoded - mvc asp.net kodunda contentType = application / json olmalıdır

(bu suala baxın, mən niyə ərizə / json istifadə etməliyəm: ASPNET MVC - Niyə ModelState.IsValid səhv "Field x tələb olunur", bu sahə məsələ nə vaxt olur? )

$ .Post () contentType = proqram / json göndərmək üçün necə edə bilərəm? Zaten bir çox $ .post () funksiyası var, buna görə $ .ajax () dəyərini dəyişdirmək istəmirəm, çünki çox uzun sürəcək

Mən cəhd edərəm

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

O, hələ contentType = tətbiqi / x-www-form-urlencoded var. Belə ki, "json" parametri content fontunu json-a dəyişməzsə nə edir?

Mən cəhd edərəm

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

Bu işləyir, lakin məndə olan bütün $ .get və $ .postu təsir edir və bəzi pozuntulara səbəb olur.

Belə ki, $ .post () 'ın davranışını contentType = application / json göndərmək üçün bir yol varmı?

260
JK-yə qoydular . 2010-05-17 00:01 17 May '05 'da 0:01 2010-05-17 00:01
@ 15 cavab

Hesab edirəm ki, ola bilərsən

1. $ .post hər zaman JSON məlumat növünü istifadə edəcəyi üçün mənbəyi dəyişdirin, çünki həqiqətən əvvəlcədən yapılandırılmış $.ajax

Və ya

2. $.ajax etmək istədiyiniz $.ajax konfiqurasiya üçün qısayol olan öz kommunal funksiyasını müəyyən edin

və ya

3. Siz $.post function yaması vasitəsilə öz tətbiqinizlə $.post function edə bilərsiniz.

Sizin nümunənizdə olan JSON məlumat növü serverə göndərilən formata deyil, serverdan qaytarılan məlumat növünə aiddir.

61
17 мая '10 в 0:05 2010-05-17 00:05 cavab Russ Cam 17 May '10 'də verildi 0:05 2010-05-17 00:05
 $.ajax({ url:url, type:"POST", data:data, contentType:"application/json; charset=utf-8", dataType:"json", success: function(){ ... } }) 
border=0

Bax: jQuery.ajax ()

346
17 мая '10 в 0:09 2010-05-17 00:09 Cavab Adrien tərəfindən 17 May '10 'da veriləcək 0:09 2010-05-17 00:09

Nəhayət, mənim üçün işləyən bir həll tapdım:

 jQuery.ajax ({ url: myurl, type: "POST", data: JSON.stringify({data:"test"}), dataType: "json", contentType: "application/json; charset=utf-8", success: function(){ // } }); 
68
26 янв. Cavab verilir vvkatwss vvkatwss 26 yanvar. 2012-01-26 17:46 '12 saat 17:46 'da 2012-01-26 17:46

Nəticədə, aşağıdakı jQuery-ni skriptimə əlavə etdim:

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

Və istifadə edin

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

Bu, sadəcə, "get" və "poçt" kodunu orijinal jQuery mənbələrindən çıxarmaq və JSON POST-nu məcbur etmək üçün bir neçə parametrləri sabitləşdirməklə həyata keçirildi.

Təşəkkür edirik!

35
26 июня '13 в 11:01 2013-06-26 11:01 cavab 26 iyun 'da saat 11:01' da davam edir. 2013-06-26 11:01

yalnız istifadə edin

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

YENİLƏNİB @ JK: sorğunuzda $ .post ilə kodun yalnız bir nümunəsini yazarsanız, cavabdakı müvafiq nümunəni tapa bilərsiniz. Daha əvvəl öyrəndiyinizə qədər eyni məlumatları təkrarlamaq istəmirəm: $ .post və $ .get qısa formaları $ .ajax. Belə ki, yalnız $ .ajax istifadə edin və qlobal parametrləri dəyişdirmədən tam dəsti seçimindən istifadə edə bilərsiniz.

Yeri gəlmişkən, standart qiyməti yazmağı məsləhət görmürəm. Bu mənim şəxsi fikrimdir, amma mənim üçün yalnız proqramın işlədilməsi deyil, həm də proqramınızı oxuyan hər kəs eyni şəkildə başa düşən vacibdir. Ciddi bir səbəb olmadan standart metodların üzərində yazılması proqram kodunu oxuduğunda bir yanlış anlayışa riayət edə bilər. Buna görə də, təkrar mənim təklifimi təkrar edirəm: jQuery.getjQuery.post əvəzinə orijinal $ .ajax jQuery formasını istifadə jQuery.get və yalnız yaxşı işləməyəcək, lakin hər hansı bir yanlış anlaşma olmadan insanlar tərəfindən oxuya biləcək proqramları əldə edirsiniz.

20
17 мая '10 в 0:07 2010-05-17 00:07 Cavab Oleq 17 may '10 'da 0:07' da verildi

Son parametrə (post) keçə biləcəyiniz "json" data növü funksiyanın serverin cavabında gözlədiyi məlumatın növünü və istəkdə göndərdiyi növü deyil, göstərir. Xüsusilə, "Qəbul" başlığını qoyur.

Dürüst, ajax () çağırışına keçmək yaxşıdır. Post () funksiyası rahatlıq üçün nəzərdə tutulmuşdur; Ajax () zənginin sadələşdirilmiş versiyası, sadəcə sadə forma dərc olunduqda. Siz deyilsiniz.

Həqiqətən keçid etmək istəməsəniz, xpost () adlanan öz funksiyasını edə bilərsiniz və sadəcə belirtilen parametrləri jQuery ajax () 'ı məzmun növü ilə təyin etmək üçün parametrlərə çevirə bilərsiniz. Belə ki, ajax () funksiyasındaki bütün post () funksiyalarını yenidən yazmaq yerinə, onları poçtdan xpost-a (ya da başqa bir şeyə) dəyişmək lazımdır.

8
17 мая '10 в 0:14 2010-05-17 00:14 Cavab Jacob Mattison tərəfindən 17 May '10 'da 0:14 2010-05-17 00:14 tərəfindən verilir

Bilirəm ki, bu gec cavabdır. Mən, həqiqətən, MS əsaslı xidmətlərdən dərc etmə / oxumaq üçün istifadə etdiyim bir qısa yola malikəm. MVC ilə, eləcə də ASMX ilə işləyir.

İstifadə edin:

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

Qeyd. MS "/Date(...)" tarixlərini işləyən js json.org faylından dəyişdirilmiş bir JSON.parseAjax metodu da var ...

Modifikasiya edilmiş json2.js faylı daxil edilmir, IE8 halda skript bazlı ayrıştırıcıdan istifadə olunur, çünki prototip array və / və ya obyekt genişləndikdə və yerli və s.

Söz verdiyim interfeysləri yerinə yetirmək üçün bu kodu yeniləmək imkanını nəzərdən keçirdim, amma mənim üçün çox yaxşı iş gördü.

5
28 марта '12 в 2:24 2012-03-28 02:24 Cavab verildi Tracker1 28 mart '12 saat 02:24 'da 2012-03-28 02:24

Məsələin qəlbində jQuery yazma zamanı postJSON metoduna malik deyil, getJSON var və doğru şeydir.

PostJSON metodu aşağıdakıları yerinə yetirəcəkdir:

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

və aşağıdakı kimi istifadə edilə bilər:

 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 cavab 22 may 2014 - il tarixdə saat 10:22 da verilir

$ .PostJSON () üçün bu sadə jquery API uzadılması ( https://benjamin-schweizer.de/jquerypostjson.html ) bu oyunu edir. Hər hansı digər xüsusi jquery Ajax zəngi kimi postJSON () istifadə edə bilərsiniz. Hadisə işleyicilerini və s. Əlavə edə bilərsiniz.

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

Digər Ajax API'lar (AngularJS-dən $ http kimi) kimi, / json proqramı üçün düzgün contentType növünü təyin edir. JSON məlumatlarınızı (javascript obyektlərini) birbaşa ötürə bilərsiniz, çünki burada bir simli olur. Gözlənilən geri məlumat növü JSON olaraq təyin olunur. Jquery default tədbir işleyicilerini söz verə bilər, məsələn:

 $.postJSON(apiURL, jsonData) .fail(function(res) { console.error(res.responseText); }) .always(function() { console.log("FINISHED ajax post, hide the loading throbber"); }); 
2
18 апр. Ruwen tərəfindən 18 apreldə cavab verildi 2018-04-18 08:40 '18 saat 08:40 'da 2018-04-18 08:40' də
0
13 марта '15 в 4:43 2015-03-13 04:43 Ben Creasy tərəfindən verilmiş cavab 13 Mart '15 'də 4:43' də 2015-03-13 04:43

Aşağıdakı javascript koduyla bənzər bir problemim vardı:

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

Fiddlerdə harada sorguyu istifadə edə bilərəm:

  • Title: Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • Bədən: {"value":"5","maxValue":"5"}

Nəticədə, serverim server tərəfinin növü ilə obyektə uyğun gəlmədi.

Sonuncu xəttini dəyişdikdən sonra:

 $.post(url, rating, showSavedNotification); 

Fiddlerdə hələ də görünə bilərəm:

  • Title: Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • Body: value=5>

Lakin, server gözlənilənləri qaytarmağa başladı.

0
21 нояб. cavab Oleq Burov 21 noyabrda verilir . 2016-11-21 02:20 '16 'da 2:20' də 2016-11-21 02:20 'də

Nədənsə, @Adrien tərəfindən təklif edilən ajax sorğusundakı məzmun növünü mənə kömək etmədi. Bununla belə, əvvəllər bunu edərək $ .post istifadə edərək məzmun tipini həqiqətən dəyişdirə bilərsiniz:

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

Sonra $.post :

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

JQuery + IIS ilə problemlər yaşadım və bu, jQuery-in ajax istəkləri üçün Windows-1252 kodlamasından necə istifadə etdiyini başa düşməsinə kömək edən yeganə həll idi.

0
27 февр. Johannes 27 Fevralda cavablandırdı. 2018-02-27 14:06 '18 at 2:06 pm 02/02/1927 14:06

biz $ .post kimi məzmun tipini dəyişə bilərik

$ .post (url, data, funksiya (data, status, xhr) {xhr.setRequestHeader ("Content-type", "tətbiq / x-www-form-urlencoded; charset = utf-8");

0
16 авг. Cavab Snziv Gupta 16 aug tərəfindən verilir . 2018-08-16 05:02 '18 at 5:02 2018-08-16 05:02

Öz adapteriniz / paketiniz haqqında nə deyə bilərsiniz?

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

Və çox sadə istifadə:

 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 авг. Cavab Blackening 28 aug tərəfindən verilir . 2014-08-28 12:47 '14 saat 12:47 2014-08-28 12:47

Birbaşa application/json göndərə bilməzsiniz - bir GET / POST sorğu parametri olmalıdır.

Belə bir şey

 $.post(url, {json: "...json..."}, function()); 
-16
17 мая '10 в 0:06 2010-05-17 00:06 Amy B'ye 17 May 'da cavab verdi 0:06 2010-05-17 00:06

tags ilə bağlı digər suallar və ya bir sual