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


805

私は自分の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);
}

C#コード 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")削除が成功した後の文字列が必要です。コンテンツを削除することはできますが、このメッセージは表示されません。これは正しいですか、それとも何か間違っていますか?この問題を解決する正しい方法は何ですか?


2
JSONバリデーターを介してJqueryOperation.aspxの出力を実行し、JSONバリデーターが有効かどうかを確認できますか
parapura rajkumar

1
同様jsonlint.com。送信するパラメータも確認する必要があります。現在、パラメータ名を設定していません。パラメータがの場合、文字列ではなくにTwitterIdオブジェクトを渡す必要がdataあります:data: {TwitterId: row}
Felix Kling、

6
Jqueryoperation.aspxページは(有効な)JSONを返しますか?
Salman A

1
おそらくあなたのサーバー側のコードは例外を投げています...応答としてあなたのcatchブロックで何を返すのですか?
Raghav、

3
例外投げサーバが要求を処理する場合@Raghav、次いで、HTTP戻りコードは500であろう
StuperUser

回答:


1118

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


AJAXコードには以下が含まれます。

dataType: "json"

この場合、jQuery:

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

サーバー側のコードは、200 OKステータス付きのHTMLスニペットを返します。jQueryは有効なJSONを予期していたため、に関するエラーコールバックを起動しますparseerror

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

Content-Type: application/javascript

alert("Record Deleted");

ただし、JSON応答を返し、成功コールバック内にメッセージを表示することをお勧めします。

Content-Type: application/json

{"message": "Record deleted"}

1
返信ありがとうございます。コードビハインドからjson値を返す方法を教えてください。C#でAsp.netを使用しています。これで私の問題は解決しましたが、このことも教えてください。
Pankaj Mishra、

1
@Pankaj:別の質問として投稿した方がいいです。しかし短い答え:これを行う2つの方法(i)$.ajaxを試す代わりに$.getScript。サーバー側のC#スクリプト内にalert('Record Deleted');<script>タグなしで)配置し、C#スクリプトのContentTypeをに設定しますtext/javascript$.ajaxうまくいくかもしれませんが、どうすればいいのか思い出せませんdataType: 'script',。成功ハンドラはもう必要ないかもしれません。
Salman A

3
この回答は完全ではない可能性があります。ちょうど今、jsonlint.comでJSONを検証しましたが、jsonlint.comはそれが有効なjsonであると明示的に示していますが、それでもxhr.status 200で「エラー」イベントが発生します。– Ramesh Pareekは今編集中
Ramesh Pareek '30 / 06/30

2
または、「dataType:json」パラメータを削除することもできます
ピエロアルベルト

1
を使用するときにデータ型を指定せずに、この同じ問題に遭遇しました$.post。この場合、jqueryはデータ型を推測し、解析に失敗するとエラーになります。これは本当に厄介で、見つけづらい問題です。データタイプをに設定して修正しました"text"
マシュマガル

31

スペースで区切られたdataType複数のs(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
});

1
同様に、JQueryドキュメントに基づいて、「jsonp xml」などの省略文字列は、最初にjsonpからxmlへの変換を試み、失敗すると、jsonpからテキストへ、次にテキストからxmlへの変換を試みます。したがって、最初にjsonにテキストを変換しようとしますが、失敗した場合はテキストとして扱われますか?
IBMer 2016年

29

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

22

OPと同様の問題の解決策を探しているときにこの投稿にぶつかったので、これは単なる記録です。

私の場合、Chromeの同一生成元ポリシーのため、jQuery Ajaxリクエストが成功しませんでした。サーバー(Node.js)を変更してすべて解決しました:

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

文字通り、頭を壁にぶつける時間を費やしました。バカになってる...


1
ピーターに感謝します。同じ問題がありました。ブラウザコンソールの警告メッセージが混乱しています。CORSが送信リクエストを(オプションメソッドネゴシエーションを使用して)ブロックしていることを知っている限り、操作が完了した後のブロックは意味がありません。多分カスタムブラウザの振る舞いでしょう。私はFirefoxでテストしました。ありがとう、あなたの解決策は私の問題を解決しました。
danipenaperez

15

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

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

Response.Write(OutPut);

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

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus 発生しているエラーのタイプがわかるはずです。


12

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

次に、Ajax呼び出しで言及してくださいdataType='text'

問題を解決します。


8

dataType: 'json'実装したWebサービスメソッドが無効な場合は、ヘッダーから削除する必要があります。

この場合、Ajax呼び出しはJSONの戻りデータ型を想定していません。


4

次のコードを使用して、応答がJSON形式(PHPバージョン)であることを確認します...

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

4

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

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

3

私は同様の問題を抱えていますが、データ型を削除しようとしたとき: '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); }
    });
}

私は同じことを見ています。200コードの空の応答はまだエラーハンドラーをトリガーしています。
doublejosh

2

私を混乱させる別のことlocalhostは、127.0.0.1の代わりに、またはその逆を使用することでした。どうやら、JavaScriptは一方から他方へのリクエストを処理できません。


2

こちらをご覧ください。その同様の問題。働いてみました。

削除しないでください dataType: 'JSON',

注:phpのみを使用している場合、PHPファイルでJSON形式のみをエコーし​​ます。ajaxコードをエコーすると200が返されます。


1

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


1

サーバーから常にJSONを返す場合(空の応答がない場合)、動作するdataType: 'json'はずであり、必要contentTypeありません。ただし、JSON出力を確認してください...

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


-1

スクリプトはJSONデータ型での戻りを要求します。

これを試して:

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

-9

フォローしてみてください

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

または

$.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オブジェクトでは、単一引用符の代わりに二重引用符を使用します。これで問題は解決すると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.