web-dev-qa-db-ja.com

Ajaxリクエストが200 OKを返すが、成功ではなくエラーイベントが発生する

私は自分のWebサイトにAjaxリクエストを実装し、Webページからエンドポイントを呼び出しています。常に 200 OK が返されますが、jQueryはエラーイベントを実行します。私はたくさんのことを試みましたが、私は問題を理解することができませんでした。以下にコードを追加します。

jQueryコード

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

JqueryOpeartion.aspxのC#コード

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

削除が成功したら、("Record deleted")文字列が必要です。コンテンツを削除することはできますが、このメッセージは表示されません。これは正しいですか、それとも私は何か悪いことをしていますか?この問題を解決するための正しい方法は何ですか?

706
Pankaj Mishra

jQuery.ajax は、指定されたdataTypeパラメータまたはサーバーから送信されたContent-Typeヘッダーに応じて、応答本文の変換を試みます。変換が失敗した場合(JSON/XMLが無効な場合など)、エラーコールバックが発生します。


あなたのAJAXコードは以下を含みます:

dataType: "json"

この場合jQueryは:

応答をJSONとして評価し、JavaScriptオブジェクトを返します。 […] JSONデータは厳密な方法で解析されます。不正なJSONは拒否され、解析エラーが発生します。 […]空の応答も拒否されます。サーバーは代わりにnullまたは{}の応答を返すべきです。

サーバーサイドコードは200 OKステータスのHTMLスニペットを返します。 jQueryは有効なJSONを期待していたので、parseerrorについて文句を言うエラーコールバックを起動します。

解決策は、jQueryコードからdataTypeパラメータを削除し、サーバーサイドコードに返させることです。

Content-Type: application/javascript

alert("Record Deleted");

しかし、私はむしろJSONレスポンスを返して、成功コールバックの中にメッセージを表示することをお勧めします。

Content-Type: application/json

{"message": "Record deleted"}
1016
Salman A

私は、スペースで区切られた複数のdataTypes( jQuery 1.5+ )を使用して、幸運を祈りました。のように:

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

AJAX呼び出しで dataType: "json" を削除するだけです。

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

私がこの問題の解決策を探しているときにこの記事に遭遇したので、これはちょうど記録のためのものです。それはOPのものに似ていました。

私の場合、私のjQuery AjaxリクエストはChromeで same-Originポリシー が原因で成功するのを妨げられました。サーバ(Node.js)を以下のように変更したところ、すべて解決しました。

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

それは文字通り私の頭を壁にぶつけるのに1時間かかる。私はばかげている...

18
Corvin

あなたのaspxページはJSONオブジェクトを返さないと思います。あなたのページはこのようなことをするべきです(page_load)

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

Response.Write(OutPut);

また、AjaxFailedを変更してみてください。

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatusはあなたにあなたが得ているエラーのタイプを与えるべきです。

13
LeftyX

更新されたjQueryライブラリでこの問題に直面しました。サービスメソッドが何も返さない場合は、戻り型がvoidです。

それから、Ajax呼び出しでdataType='text'を言及してください。

それは問題を解決します。

12

実装したWebサービスメソッドが無効な場合は、ヘッダーからdataType: 'json'を削除するだけです。

この場合、Ajax呼び出しはJSON戻りデータ型を持つことを期待していません。

7
Bilel omrani

私は同じ問題を抱えていました。私の問題は私のコントローラーがJSONの代わりにステータスコードを返していたことです。コントローラが次のようなものを返すことを確認してください。

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

私は同様の問題を抱えていますが、データ型を削除しようとしたときに 'json'私はまだ問題を抱えています。私のエラーは成功の代わりに実行されています

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); }
    });
}
3
Rakesh Kumar

次のコードを使用して、レスポンスがJSON形式(PHPバージョン)であることを確認してください。

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

これを見なさい 。それも同様の問題です。私が試してみました。

dataType: 'JSON',を削除しない

注:phpエコーのみを使用している場合はPHPファイルにJSON Formateのみをエコーし​​、ajaxコードでは200を返してください

2
Inderjeet

私を困惑させたもう1つのことは、127.0.0.1の代わりにlocalhostを使用すること、またはその逆です。どうやら、JavaScriptは一方から他方への要求を処理できません。

2
Paul

私は同じ問題を抱えていました。これは、私のJSONレスポンスに特殊文字が含まれていて、サーバーファイルがUTF-8でエンコードされていなかったためです。そのため、Ajax呼び出しはこれが有効なJSONレスポンスではないと見なしました。

1
Mehdi Izcool

常にサーバーからJSONを返す(空の応答がない)場合は、dataType: 'json'が機能し、contentTypeは不要です。しかし、JSON出力を確認してください...

jQuery AJAXは、有効だがシリアル化されていないJSONに対して「parseerror」をスローします。

1