概要
jQueryで下記のようにAjax通信をしていたときに、
サーバ側はステータスOKを返していても成功時のコールバック関数(done)
が実行されないという問題が起こったので備忘録として記載。
$.ajax({
type: "POST",
url: "APIのURL",
dataType: "json",
data: {
パラメータ...
}
})
.done(function () {
alert("OK");
})
.fail(function () {
alert("NG");
});
TLDR
ajaxオプションのTypeにjsonを指定してるとレスポンスが存在している & 厳格なJSONであるかチェックする。
空レスポンスを返していたのでエラーとなりfailで処理されていた。
Typeをtextにして空文字列として処理するようにした。
詳細
$.ajaxのオプションであるtypeのリファレンスを見ると
オプションの意味及びJSON指定時は下記のように書いてある。
dataType / string
サーバから返されるデータの型を指定します。
省略した場合は、jQueryがMIMEタイプなどを見ながら自動的に判別します。
指定可能な値は、次のようなものです。
:
"json": JSON形式のデータとして評価し、JavaScriptのオブジェクトに変換します。
"text": 通常の文字列。
APIのレスポンスは空だったのに対し、dataTypeはJSONを指定していたため、
空文字列をパースしようとしてエラー。
結果doneではなくfailが実行されていた。
対処として上記引用のtype:text
を指定して空文字列として扱うと、無事doneがコールされた。
参考
http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/
https://trialanderror.jp/ajax-fail/