最新の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{}
では、この質問の最初の行のように、最善のアプローチは何ですか? 他のアイデアはありますか?