1

最新のjquery ajaxリクエストをhttp互換のアプローチで使用して、データ送信とエラー処理の正しい方法をどのように見るべきか疑問に思っています。

サーバー側で未処理の例外が発生し、http プロトコルで期待しているデータ型を指定しなかった場合、 successメソッドが呼び出され、クライアントは何も問題がなかったかのように 200 OK 応答を受け取ることに気付きました。

$.ajax({
    url: action,
    type: 'POST',
    data: jsondata,
    success: function (data, textStatus, xhr) {
            // i'm here now
        },
    error: function (XMLHttpRequest, textStatus, errorThrown) {            
        }
});

ここに画像の説明を入力

ここに画像の説明を入力

たとえばjsonに期待しているタイプを指定すると、ajaxエラー関数が呼び出されます。これは、スタック トレースがデフォルトで json にシリアル化されていないため、解析が失敗するためです。

$.ajax({
    url: action,
    type: 'POST',
    dataType: 'json',
    data: jsondata,
    contentType: 'application/json; charset=utf-8',
    success: function (data, textStatus, xhr) {
        },
    error: function (XMLHttpRequest, textStatus, errorThrown) {            
            // but now I'm here
        }
});

ここに画像の説明を入力

ここに画像の説明を入力

これも 200 OK ですが、エラー (成功ではない) が呼び出されます。

例外処理に対処するためのより良い方法は何ですか。私の意見ではより RESTFull であるタイプを指定する必要がありますか、それとも単に指定しないままにして、常に成功にジャンプする必要がありますか?

サーバー側で常に ajax メソッドをtry{}catch(){}ブロックでラップし、適切なタイプのエラーを渡す必要があります。クライアントは返すように求めますか?

[HttpPost]
public NJsonResult Execute()
{
    try
    {
        // do some logic if you do not mind
        if (success)
        {
             return new NJsonResult(new {status = "success"});
        }
        return new NJsonResult(new { status = "error" });
    }
    catch(Exception e)
    {
        return new NJsonResult(new { status = "error" });        
    }
}

$.ajax({
    type: 'POST',
    url: action,
    dataType: 'json',
    data: jsondata,
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        if (data.status == "success") {
        }
        else (data.status == "error") {
        }
    }

Mabye は常に予測可能なエラーを気にし、例外を気にせず、型を指定しなかったのでしょうか?

[HttpPost]
public NJsonResult Execute()
{
    // do some logic if you do not mind
    if (success)
    {
        return new NJsonResult(new {status = "success"});
    }
    return new NJsonResult(new { status = "error" });
}

$.ajax({
    type: 'POST',
    url: action,
    data: data,
    success: function (data) {
        if (data.status == "success") {
        }
        else {
            // handle even exceptions, because content-type in not specified
        }
    }
});

エラー関数と正しい http ステータス コードの場所はどこですか (常に 200 OK とは限りません)。

これで、未処理の例外をインターセプトするためのグローバル フックを実装しました。

$(document).ready(function () {    
    $.ajaxSetup({
        error: function (XMLHttpRequest, textStatus, errorThrown) {            
            // handle it if you dare
        }
    });    
});

contentTypeおよびdataType ajax プロパティを使用して、常にcontent-typeを指定し、ヘッダーを受け入れます。私はブロックを使用しません - ロジックの異常な動作は気にしません。それをGlobal.asaxに記録し、さらに応答に渡します。try{}catch{}

では、この質問の最初の行のように、最善のアプローチは何ですか? 他のアイデアはありますか?

4

0 に答える 0