Jquery - $ .post () nasıl contentType = application / json kullanılır?


309

Asp.net mvc kodum contentType = application / json olması gerektiğinde $ .post () jquery varsayılan contentType uygulama / x-www-form-urlencoded olduğunu fark ettim

(Neden application / json kullanmalıyım için bu soruya bakın: ASPNET MVC - Bu alanın bir değeri olduğunda neden ModelState.IsValid false "x alanı gereklidir"? )

$ .Post () göndermeyi nasıl contentType = application / json yapabilirim? Zaten $ .post () fonksiyonları çok sayıda var, bu yüzden çok zaman alacak çünkü $ .ajax () değiştirmek istemiyorum

Eğer denersem

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

Hala contentType = application / x-www-form-urlencoded var. Peki içerik türünü json olarak değiştirmezse "json" parametresi tam olarak ne yapar?

Eğer denersem

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

Bu çalışıyor ama sahip olduğum her $ .get ve $ .post etkiler ve bazılarının kırılmasına neden olur.

Yani contentType = application / json göndermek için $ .post () davranışını değiştirmek için bir yolu var mı?

Yanıtlar:


71

Bence yapmanız gerekebilir

1. $ .post yapmak için kaynağı değiştirin, her zaman JSON veri türünü kullanın, çünkü gerçekten önceden yapılandırılmış bir $.ajaxçağrı için bir kısayoldur

Veya

2. Kullanmak $.ajaxistediğiniz yapılandırma için bir kısayol olan kendi yardımcı program işlevinizi tanımlayın

Veya

3. $.post functionmaymun yama ile kendi uygulamanız ile üzerine yazabilirsiniz .

Sizin örnekte JSON veri türü iade veri türü ifade eder dan sunucu ve olmayan biçim gönderilen sunucuya.


5
+1, yeni bir yöntem veya üzerine yazma jQuery.postyöntemi tanımlamak için giderdim , bu gerçekten basit bir işlev ...
CMS

3
Kötü bir fikir değil, sadece $ .post ile aynı olan $ .mvcpost () adlı bir yöntem oluşturun (bağlantılı kodu kopyalayarak) ve içerik türünü değiştirir. Sonra değiştirilmesi gereken tüm $ .post () s için, sadece önde 3 ekstra karakter yazmak zorunda. Onları $ .ajax () olarak yeniden yazmaktan çok daha hızlı.
JK.

9
@PavelRepin, yük üzerinde JSON.stringify () çağırmak zorunda kaldı.
Ustaman Sangat

2
@dragon - "3 .post () davranışını contentType = application / json göndermek için değiştirebileceğim bir yol var mı?" Hangi kısım cevap değil?
Russ Cam

2
Bilmek de önemlidir: $ .ajax ve çeşitli yöntemler, verdiğiniz verilere dayanarak contentType'ın (belirtilmediği sürece) ne olması gerektiğini tahmin etmeye çalışır. nesnenin "mystring data"olduğu application/x-www-form-urlencoded;yerde { anyKey: "anyvalue and type" }olacaktır application/json. Json okuyan birçok sunucu, bir dizeye değil, yalnızca bir nesneye veya diziye izin verir. Bir nesneye sarılmadan dizeleri, sayıları vb. Okuyan bir sunucunuz varsa, bu cevaptaki gibi içerik türünü belirtmeniz gerekir.
bzuillsmith

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

Bkz. JQuery.ajax ()


13
Orijinal yazı sorar: "Yani $ .post () davranışını contentType = application / json göndermek için değiştirmenin bir yolu var mı?" AMA aynı zamanda "Bu çalışıyor ama sahip olduğum her bir $ .get ve $ .post etkiler ve bazılarının kırılmasına neden olur." "$ .Post kullanarak aynı şeyi nasıl elde edebilirim ama $ .get ve $ .post diğer oluşumlarını bozmadan doğru contentType göndermek nasıl" sorusunu anlıyorum. Bu yanlış mı?
Adrien

5
@ x1a4 açıkça ajax değil .ajax çağrı olduğunu anlamıyorSetup
Walker

39
@Adrien, iki yıl sonra değerinde olan şey, bu google'ı aradığımda aradığım cevap.
AwesomeTown

74
Kullanım zorunda JSON.stringify(data)sunucu JSON dize bekliyor ve jQuery basitçe ve işaretleri, form-urlencoded kullanarak anahtar-değer çiftleri bitiştirmek olacağından,.
ejderha

3
Dört yıl sonra bile, bu cevap on saatten az kodla arama saatlerimi çözdü.
Pieter VDE

86

Sonunda benim için çalışan çözümü buldum:

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

8
Neden hata almaya devam ettiğimi anlayamadım, verileri dizginlemeniz gerekiyor.
FriendlyGuy

5
Bunun işe yaradığını biliyorum, ama NEDEN oh NEDEN stringize etmeniz gerekiyor? Bir jQuery hatası mı? Bağımsız datadeğişkeninizi serileştirmekten mutluluk duyacaktır x-www-form-urlencoded, ancak istek içerik türünün JSON olduğunu belirtirseniz, yine de dataeşleşmeyen bir biçimde göndermede ısrar eder .
Pavel Repin

İyi. Çok fazla kazmadım. Çalıştığı için mutluydum. ;) Sunucum JSON gerektirir.
vvkatwss vvkatwss

Burada aynı. JSON.stringify olmadan işe yaramıyor, nedenini merak ediyorum.
John Simoes

42

Benim komut dosyası jQuery aşağıdaki yöntemi ekleyerek sona erdi:

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

Ve kullanmak için

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

Bu, sadece "get" ve "post" kodlarının orijinal JQuery kaynaklarından kopyalanması ve bir JSON POST'u zorlamak için birkaç parametrenin kodlanmasıyla yapıldı.

Teşekkürler!


2
Her zamanki gibi - en iyi cevap partiye son gelir ve en az oy verir; (
nikib3ro

Harika yanıt - $ .post'un bunu "kutunun dışında" yapmadığını anlamak biraz zaman alır.
markp3rry

21

sadece kullan

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

GÜNCELLEME @JK: Sorunuza $ .post ile yalnızca bir kod örneği yazarsanız, yanıtta karşılık gelen bir örnek bulabilirsiniz. Şimdiye kadar çalıştığınız aynı bilgiyi tekrarlamak istemiyorum: $ .post ve $ .get $ .ajax'ın kısa biçimleridir. Bu yüzden sadece $ .ajax kullanın ve herhangi bir genel ayarı değiştirmek zorunda kalmadan tüm parametre setini kullanabilirsiniz.

Bu arada standart $ .post üzerine yazma tavsiye etmem. Bu benim kişisel görüşüm , ama benim için sadece programın çalışması değil, aynı zamanda programınızı okuyan herkesin de aynı şekilde anlaması önemlidir. Çok önemli bir neden olmaksızın standart yöntemlerin üzerine yazılması , program kodunun okunmasında yanlış anlaşılmayı izleyebilir . Bu yüzden tavsiyemi bir kez daha tekrarlıyorum: sadece orijinal $ .ajax formunu jQuery yerine kullanın jQuery.getve jQuery.postsadece mükemmel bir şekilde çalışmayan, ancak yanlış anlamaları olmayan insanlar tarafından okunabilen programlar alırsınız.


1
Büyük açıklama ve kılavuz
Ved Prakash

8

Post () işlevine son parametre olarak iletebileceğiniz "json" veri türü, işlevin istekte hangi türü gönderdiğini değil, sunucu yanıtında ne tür veriler beklediğini gösterir. Özellikle "Kabul" başlığını ayarlar.

Dürüst olmak gerekirse en iyi bahis ajax () çağrısına geçmek. Post () işlevi kolaylık anlamına gelir; sadece basit bir form gönderme yaparken ajax () çağrısının basitleştirilmiş bir sürümü. Sen değilsin.

Gerçekten geçiş yapmak istemiyorsanız, xpost () adlı kendi işlevinizi yapabilir ve verilen parametreleri, içerik türü kümesiyle bir jQuery ajax () çağrısının parametrelerine dönüştürmesini sağlayabilirsiniz. Bu şekilde, tüm post () işlevlerini ajax () işlevlerine yeniden yazmak yerine, hepsini yazıdan xpost'a (ya da her neyse) değiştirmeniz yeterlidir.


Değişmesi gereken bir asp.net mvc denetleyici yöntemini çağıran sadece $ .post () yöntemleri. Saf jquery olanlar değişmemiş olmalıdır (otomatik tamamlama, diaplog, jqgrid vb) İlgili $ .post () s yapabileceğim basit bir değişiklik olacağını umuyordum. Ama ben onları $ .ajax () dönüştürmek gerekiyor gibi görünüyor. Onun büyük ve çok ajax ağır bir uygulama, bu yüzden değiştirmek için bir sürü vardır.
JK.

6

Bu basit jquery API uzantısı ( $ .postJSON () için https://benjamin-schweizer.de/jquerypostjson.html ) hile yapar. PostJSON () işlevini diğer tüm yerel jquery Ajax çağrıları gibi kullanabilirsiniz. Olay işleyicileri vb. Ekleyebilirsiniz.

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

Diğer Ajax API'ları gibi (AngularJS'den $ http gibi) application / json için doğru contentType öğesini ayarlar. Burada dize edildiği için json verilerinizi (javascript nesneleri) doğrudan iletebilirsiniz. Beklenen döndürülen dataType, JSON olarak ayarlandı. Sözler için jquery'nin varsayılan olay işleyicilerini ekleyebilirsiniz, örneğin:

$.postJSON(apiURL, jsonData)
 .fail(function(res) {
   console.error(res.responseText);
 })
 .always(function() {
   console.log("FINISHED ajax post, hide the loading throbber");
 });

5

Bu geç bir cevap olduğunu biliyorum, ben aslında / tabanlı MS tabanlı servisler / okuma için kullandığım bir kısayol yöntemi var .. MVC yanı sıra ASMX vb ile çalışır ...

kullanın:

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

Not: Ayrıca json.org'ın JS dosyasından, MS "/Date(...)/" tarihleri ​​için işleme ekler bir JSON.parseAjax yöntemi var ...

Değiştirilen json2.js dosyası dahil değildir, dizi ve / veya nesnenin prototipini genişlettiğinizde yerel ayrıştırıcının kırıldığı durumlar olduğu için IE8 durumunda komut dosyası tabanlı ayrıştırıcıyı kullanır.

Vaat arayüzlerini uygulamak için bu kodu yenilemeyi düşünüyordum, ama benim için gerçekten iyi çalıştı.


4

Konunun merkezinde, getJSON mevcutken ve doğru olanı yaparken JQuery'nin yazım sırasında bir postJSON yöntemi bulunmaması gerçeğidir.

Bir postJSON yöntemi aşağıdakileri yapar:

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

ve şu şekilde kullanılabilir:

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

1

Dokümantasyon 3,0 itibarıyla, size $ .ajax seçenekleri kullanabilirsiniz, yani ayarlar nesne kabul edecek .post, $ şu anda gösterir. 3.0 henüz yayınlanmadı ve taahhütte dokümanlardaki referansı gizleme hakkında konuşuyorlar, ancak gelecekte arayın!


1

Aşağıdaki JavaScript koduyla benzer bir sorun yaşadım:

var url = 'http://my-host-name.com/api/Rating';

var rating = { 
  value: 5,
  maxValue: 10
};

$.post(url, JSON.stringify(rating), showSavedNotification);

Nerede Fiddler I isteği görebiliyordu:

  • Başlık: Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • Vücut: {"value":"5","maxValue":"5"}

Sonuç olarak, sunucum bir nesneyi sunucu tarafı türüyle eşleyemedi.

Son satırı bu satırla değiştirdikten sonra:

$.post(url, rating, showSavedNotification);

Kemancı'da hala görebiliyordum:

  • Başlık: Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • Vücut: value=5&maxValue=10

Ancak, sunucu beklediğim dönmeye başladı.


0

Kendi adaptör / sarıcı hakkında nasıl?

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

Ve son derece basit kullanım:

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

Denendi, ancak beklenen sonuçları alamıyorum. Bahar önyükleme dinlenme API var.
Shingade Suresi

0

Nedense, @Adrien'in önerdiği gibi ajax isteğindeki içerik türünü ayarlamak benim durumumda işe yaramadı. Ancak, daha önce bunu yaparak $ .post kullanarak içerik türünü değiştirebilirsiniz:

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

Ardından $.postçağrınızı yapın:

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

JQuery + IIS ile sorun vardı ve bu jQuery ajax istekleri için windows-1252 kodlama kullanmayı anlamak yardımcı olan tek çözüm oldu.


0

İçerik türünü $ .post biçiminde değiştirebiliriz

$ .post (url, veri, işlev (veri, durum, xhr) {xhr.setRequestHeader ("İçerik türü", "uygulama / x-www-form-urlencoded; charset = utf-8");});


-1

$ .post, CORS (Çapraz Kaynak Kaynağı Paylaşımı) sorununuz varsa çalışmaz. $ .Ajax'ı şu biçimde kullanmaya çalışın: "$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, başlıklar: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', şunu yazın: 'POST', zaman uyumsuz: false, success: function (Data) {...}}); "


-19

application/jsonDoğrudan gönderemezsiniz - bir GET / POST isteğinin parametresi olmalıdır.

Yani böyle bir şey

$.post(url, {json: "...json..."}, function());

Bu cevap yanlış olabilir, ancak düşük kalite değildir ve soruyu cevaplamaya çalışmaktır. Yorumdan .
Wai Ha Lee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.