Ajax isteği 200 Tamam döndürüyor, ancak başarı yerine bir hata olayı başlatılıyor


805

Web siteme bir Ajax isteği uyguladım ve bir web sayfasından uç noktayı arıyorum. Her zaman 200 OK döndürür , ancak jQuery hata olayını yürütür.
Bir çok şey denedim ama sorunu çözemedim. Kodumu aşağıya ekliyorum:

jQuery Kodu

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

İçin C # kodu JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

("Record deleted")Başarılı silme sonra dizeye ihtiyacım var . İçeriği silebilirim, ancak bu mesajı alamıyorum. Bu doğru mu yoksa yanlış bir şey mi yapıyorum? Bu sorunu çözmenin doğru yolu nedir?


2
Bir JSON doğrulayıcı aracılığıyla JqueryOperation.aspx çıktısını çalıştırabilir ve geçerli JSON
parapura rajkumar 31:11

1
Gibi jsonlint.com . Ayrıca gönderdiğiniz parametreleri de kontrol etmelisiniz. Şu anda herhangi bir parametre adı belirlemediniz. Parametre ise TwitterId, bir nesneyi databir dize değil, iletmeniz gerekir data: {TwitterId: row}.
Felix Kling

6
Jqueryoperation.aspx sayfası (geçerli) JSON döndürüyor mu?
Salman A

1
muhtemelen sunucu tarafı kodu bir istisna atıyor .. yakalamak olarak yanıt bloğunda dönen ne ru?
Raghav

3
@Raghav, sunucu isteği işlerken bir istisna atarsa, HTTP dönüş kodu 500 olur.
StuperUser

Yanıtlar:


1118

jQuery.ajaxyanıt gövdesini belirtilen dataTypeparametreye veya Content-Typesunucu tarafından gönderilen başlığa bağlı olarak dönüştürmeye çalışır . Dönüştürme başarısız olursa (örn. JSON / XML geçersizse), hata geri araması tetiklenir.


AJAX kodunuz şunları içerir:

dataType: "json"

Bu durumda jQuery:

Yanıtı JSON olarak değerlendirir ve bir JavaScript nesnesi döndürür. […] JSON verileri katı bir şekilde ayrıştırılır; hatalı biçimlendirilmiş JSON reddedilir ve ayrıştırma hatası atılır. […] Boş bir yanıt da reddedilir; sunucu bunun yerine null veya {} yanıtı döndürmelidir.

Sunucu tarafı kodunuz, 200 OKdurum içeren HTML snippet'ini döndürür . jQuery geçerli JSON bekliyordu ve bu nedenle şikayet geri arama hatası tetikler parseerror.

Çözüm, dataTypeparametreyi jQuery kodunuzdan kaldırmak ve sunucu tarafı kodunun döndürülmesini sağlamaktır:

Content-Type: application/javascript

alert("Record Deleted");

Ama ben bir JSON yanıtı döndürme ve mesajı başarı geri arama içinde görüntülemek öneririz:

Content-Type: application/json

{"message": "Record deleted"}

1
Cevabınız için teşekkürler bana nasıl bir şey söyleyebilirim nasıl kod arkasından json değeri dönebilirsiniz. Asp.net C # ile kullanıyorum. Bu, sorunumu çözdü, ancak lütfen bana bu şeyi de bildirin.
Pankaj Mishra

1
@Pankaj: Başka bir soru olarak yayınlamak daha iyidir. Ama kısa cevap: Bunu yapmanın iki yolu (i) yerine $.ajaxdeneyebilirsiniz $.getScript. Sunucu tarafında C # betiği koymak alert('Record Deleted');( <script>etiket yok ) ve C # betiğinizin ContentType öğesini ayarlayın text/javascript. $.ajaxaynı zamanda işe yarayabilir ama nasıl olduğunu hatırlayamıyorum, belki sadece değiştirmeniz gerekiyor dataType: 'script',. Artık başarı işleyicisine ihtiyacınız olmayabilir.
Salman A

3
Bu cevap tam olmayabilir. Hemen şimdi JSON'umu jsonlint.com'da doğruladım, açıkça bunun boş bir json olduğunu söylüyor, ancak yine de "hata" olayı xhr.status 200 ile işlendi. Başka nedenler olabilir? - Ramesh Pareek şimdi düzenleyin
Ramesh Pareek

2
Veya "dataType: json" parametresini silebilirsiniz
Piero Alberto

1
Kullanırken bir veri türü belirtmeden bu aynı sorunla karşılaştım $.post. Bu durumda, jquery bir veri türü tahmin eder, ardından ayrıştırılamadığında hata verir . Bu gerçekten kötü, bulunması zor bir yakaladım. Veri tipini ayarlayarak düzelttim "text".
Mashmagar

31

Birden fazla, boşlukla ayrılmış dataTypes ( jQuery 1.5+ ) kullanarak bazı iyi şanslar yaşadım . De olduğu gibi:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

1
Benzer şekilde, "jsonp xml" gibi bir steno dizisi ilk olarak jsonp'den xml'ye dönüştürme girişiminde bulunur ve başarısız olursa, jsonp'den metne ve sonra metinden xml'ye dönüşür. Bu yüzden önce json'a metin dönüştürmeye çalışacak ve başarısız olursa, sadece metin olarak mı işlem görecek?
anIBMer

29

AJAX çağrınızdaki dataType: "json" öğesini kaldırmanız yeterlidir

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

22

Bu sadece kayıt içindir çünkü OP'lere benzer bir sorunum için bir çözüm ararken bu yazının içine girdim.

Benim durumumda, jQuery Ajax isteğimin Chrome'daki aynı menşe politika nedeniyle başarılı olması engellendi . Sunucumu (Node.js) yapmak için değiştirdiğimde hepsi çözüldü:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

Kelimenin tam anlamıyla bana kafamı duvara vurmanın bir saatine mal oldu. Kendimi aptal hissediyorum ...


1
Teşekkürler Peter, aynı sorunu yaşadım ve tarayıcı konsolundaki uyarı mesajı benim için karışık. Bildiğim kadarıyla CORS gönderme isteği engeller (seçenekler yöntemi müzakere kullanarak), hiçbir işlem tamamlandıktan sonra bu blok sonra mantıklı. Belki de özel bir tarayıcı davranışıdır .. Firefox ile test ettim. Teşekkürler, çözümünüz sorunumu çözdü.
danipenaperez

15

Aspx sayfanızın bir JSON nesnesi döndürmediğini düşünüyorum. Sayfanız böyle bir şey yapmalıdır (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

Ayrıca, AjaxFailed'inizi değiştirmeyi deneyin:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus size aldığınız hata türünü vermelidir.


12

Güncellenmiş bir jQuery kitaplığı ile bu sorunla karşılaştım. Hizmet yöntemi herhangi bir şey döndürmüyorsa, geri dönüş türü olduğu anlamına gelir void.

O zaman Ajax çağrınızda lütfen belirtin dataType='text'.

Sorunu çözecektir.


8

dataType: 'json'Uygulanan Web hizmeti yönteminiz geçersizse, başlığınızdan kaldırmanız yeterlidir.

Bu durumda, Ajax çağrısı bir JSON dönüş veri tipine sahip olmayı beklemez.


4

Yanıtın JSON biçiminde (PHP sürümü) olduğundan emin olmak için aşağıdaki kodu kullanın ...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;

4

Aynı sorunu yaşadım. Benim sorunum denetleyicim JSON yerine bir durum kodu döndürüyordu oldu. Denetleyicinizin aşağıdaki gibi bir şey döndürdüğünden emin olun:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

3

Ben de benzer bir sorun var ama ben 'json' veri tipini kaldırmaya çalışırken hala sorun var. Başarım yerine hatam yürütülüyor

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}

Aynı şeyi görüyorum. 200 kodlu boş yanıt hala hata işleyiciyi tetikliyor.
doublejosh

2

Benim için işleri berbat eden bir başka şey localhost127.0.0.1 yerine ya da tam tersi. Görünüşe göre, JavaScript birinden diğerine istekleri işleyemiyor.


2

Bunu gör . Aynı problem. Çalışma denedim.

Kaldırma dataType: 'JSON',

Not: sadece php echo kullanıyorsanız sadece PHP dosyasında JSON Formate yankı ajax kodu dönüş 200


1

Ben de aynı problemi yaşadım. Bunun nedeni, JSON yanıtımın bazı özel karakterler içermesi ve sunucu dosyasının UTF-8 ile kodlanmamış olmasıdır, bu nedenle Ajax çağrısı bunun geçerli bir JSON yanıtı olmadığını düşündü.


1

Her zaman sunucudan JSON döndürürseniz (boş yanıt yok), dataType: 'json'çalışması gerekir ve contentTypegerekli değildir. Ancak JSON çıktısının ...

jQuery AJAX, geçerli ancak serileştirilmemiş JSON'a 'ayrıştırıcı' atacak!


-1

Komut dosyanız JSON veri türünde bir geri dönüş istiyor.

Bunu dene:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}

-9

Takip etmeyi deneyin

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

VEYA

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

JSON nesnesindeki tek tırnak yerine çift tırnak kullanın. Bunun sorunu çözeceğini düşünüyorum.

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.