$ .Ajax ile sorgu dizesi yerine JSON nasıl gönderilir?


172

Birisi nasıl bir sorgu dizesi yerine gerçek JSON göndermek jQuery yapmak kolay bir şekilde açıklayabilir misiniz?

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});

Bu aslında özenle hazırlanmış JSON'unuzu bir sorgu dizesine dönüştürecektir. Can sıkıcı şeylerden biri , muhtemelen sorgu sokmasının sınırlamaları nedeniyle, array: []nesnenizdeki herhangi birinin dönüştürülmesidir array[]: [].


7
dataTypeVeri gönderildiğinde nasıl bir ilgisi yoktur. Yalnızca çağrı tarafından ne tür bir veri döndürmeyi beklediğinizi belirtir . Sunucuya ne tür bir veri belirttiğinizi sunucuya belirtmek dataistiyorsanız, contentTypeözelliği benzer şekilde ayarlamanız gerekircontentType: "application/json"
Nope

Açıkladığınız için teşekkürler. Ancak bu durumda, sunucu yanıtta içerik türü üstbilgisi sağlıyorsa neden istemci tarafı yanıt türünü belirtmem gerekiyor?
Redsandro

2
Sen yok olması , onu belirtmek için varsayılan olarak jQuery denemek ve yanıtın MIME türüne göre akıllı bir tahmin yapmak olacaktır. Ancak bunu belirterek, jQuery'ye sunucudan ne tür beklediğinizi açıkça söylersiniz ve jQuery, yanıtı bu tür bir nesneye dönüştürmeye çalışır. Sunucudan JSON göndermiş olsanız bile, jQuery'nin bir tahmin yapmaması ve jQuery'den ayrılmaması, yanıtın beklenmedik bir biçime dönüştürülmesine neden olabilir. Veri hakkında daha fazla bilgi için belgelere bakınTip: api.jquery.com/jQuery.ajax
Hayır

Yanıtlar:


256

Önce JSON.stringifynesnenizi JSON'a serileştirmek için kullanmanız ve ardından contentTypesunucunuzun JSON olduğunu anlaması için belirtmeniz gerekir. Bu hile yapmalı:

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

JSONNesnenin yerel olarak JavaScript 1.7 / ECMAScript 5 veya üstünü destekleyen tarayıcılarda kullanılabildiğini unutmayın . Eski desteğe ihtiyacınız varsa json2'yi kullanabilirsiniz .


14
Bu işe yaramayacak, eksik contentType: 'application/json'.
Ohgodwhy

@Ohgodwhy Oh evet. Bu biraz hızlı gitti;)
mekwall

1
Teşekkürler. DataType'ın bununla ilgilendiğini düşündüm, ama bunu geriye aldım. Diğer cevapta Bergi gibi içerik türünde karakter kümesi belirtmekle ilgili düşünceleriniz var mı?
Redsandro

5
@Redsandro Bu gerekli olmamalı. JQuery belgelerine göre:POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard
mekwall

1
@ shorif2000 hiç olmadığı kadar iyi geç ... sorun $_POSTphp içinde sadece görebilirsiniz application/x-www-form-urlencoded, eğer json verilerini okumak istiyorsanız file_get_contents("php://input")ve belki de sonra ojson_decode()
santiago arizti 23:18

28

Hayır, dataTypeseçenek alınan verileri ayrıştırmak içindir.

JSON yayınlamak için, bunu kendiniz dizgi yapmanız JSON.stringifyve processDataseçeneği şu şekilde ayarlamanız gerekir false.

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

Tüm tarayıcıların JSONnesneyi desteklemediğini ve .parseJSONjQuery'de bulunmasına rağmen herhangi bir stringifier içermediğini unutmayın; başka bir çoklu dolgu kütüphanesine ihtiyacınız olacak.


4
Ayar processDataiçin falseçünkü gerekli değildir JSON.stringifyzaten bir dize döndürür.
mekwall

@MarcusEkwall: Afaik hâlâ encodeURIComponentdüzenlenirdi, değil mi?
Bergi

Tamam, gerekli olmayabilir, ancak isteğin gerçekten başarısız olacağını düşünüyor musunuz?
Bergi

Zaten bir dize olduğunu düşünerek başarısız yapmamalı.
Kevin B

1
@Redsandro: Evet, "akıllı bir tahmin" yapıyor. Bununla birlikte, parametrenin nedeni (yalnızca) insanların katılaştırmak istememesi değil, sunucu yanıtlarında uygun MIME türlerini ayarlamamasıdır.
Bergi

5

ASP.NET MVC gibi pek çok mimarinin JSON.stringify'ı ele almak için yerleşik işlevselliğe sahip olduğunu biliyorum. Beni saatlerce kurtaracağını biliyorum!

Http isteklerim, farklı bir alt etki alanında IBM'den (AS400 ortamı) bir CGI API'sı tarafından işlendiğinden, bu istekler çapraz kaynaklıdır, dolayısıyla jsonp'dir. Aslında ajax'ımı javascript nesneleri ile gönderiyorum. İşte benim ajax POST bir örnek:

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });

2
Bu soruya daha fazla bilgi eklediğiniz için teşekkür ederiz! Tatmin edici cevap zaten verilmişti, ama sizinkini iptal ettim.
Redsandro

1

Bunu asp.net'e geri gönderiyorsanız ve request.form [] içindeki verilere ihtiyacınız varsa, içerik türünü "application / x-www-form-urlencoded; charset = utf-8" olarak ayarlamanız gerekir.

Orijinal yayın burada

İkincisi, Datatype'den kurtulun, eğer bir dönüş beklemiyorsanız, POST başarısız olmadan önce yaklaşık 4 dakika bekleyecektir. Buraya bakın

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.