#Safariのajax読み込みでPrecondition Failedになる場合
##発生状況
jqueryの$.ajaxで以下のようにデータを取得している場合
$.ajax({
url: "hoge.json",
method: 'POST',
dataType: 'json',
})
.done(function(data) {
//do something
})
.fail(function() {
console.log( "error" );
})
.always(function() {
//do something
});
##発生するエラー
[Error] Failed to load resource: the server responded with a status of 412 (Precondition Failed) (hoge.json, line 0)
##直し方
$.ajaxのbeforeSendで時間を指定してあげれば良い。
確認しているなかで、safariがヒットする。iOSのサファリも出るのかな。
$.ajax({
url: "hoge.json",
method: 'POST',
dataType: 'json',
//以下追加
//再現している環境がsafariのみなので、安易にsafariのみ判定
beforeSend : function( xhr ){
if (window.navigator.userAgent.toLowerCase().indexOf('safari') != -1)
xhr.setRequestHeader("If-Modified-Since", new Date().toUTCString());
}
})
##なんで治るのかというか、そもそもなんのエラーなのか
###リクエストヘッダーの以下の値の評価がfalseになってしまうらしい←
(リクエストヘッダーって、なんぞ、っていう。。
すみません、詳しい方いたら補足もらえると嬉しいっす。)
- If-Match
- If-None-Match
- If-Unmodified-Since
ということで、そのうちの1つ、If-Unmodified-Sinceに最新データを渡してあげて、最新データと認識させてあげる。
調べると、chromeでもエラー出てるケースもあるみたいで、果たしてこの方法が良いのか悪いのか。
・・・