Safari дважды отправляет вызовы ajax - PullRequest
6 голосов
/ 11 мая 2011

Я заметил, что Safari 5.0.5 (6533.21.1), кажется, отправляет повторяющиеся вызовы ajax.Когда я запускаю следующий сокращенный контрольный пример:

// jquery 1.6 include
$(document).ready(function() {
    setTimeout(function(e) {
        var req1 = $.getJSON('/api/private/customers.json');
        console.log('req1 sent');
    }, 2000);
    setTimeout(function(e) {
        var req2 = $.getJSON('/api/private/customers.json');
        console.log('req1 sent');
    }, 4000);
});

панель ресурсов Safari и консоль показывают, что два запроса xhr выходят, но мой журнал сервера показывает три входящих запроса xhr:

XX.XX.XX.XXX - - [10/May/2011:16:50:40 -0400] "GET /api/private/customers.json HTTP/1.1" 200 183 "https://sub.mydomain.com/customers" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"
XX.XX.XX.XXX - - [10/May/2011:16:50:42 -0400] "GET /api/private/customers.json HTTP/1.1" 200 183 "https://sub.mydomain.com/customers" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"
XX.XX.XX.XXX - - [10/May/2011:16:50:42 -0400] "GET /api/private/customers.json HTTP/1.1" 200 183 "https://sub.mycomain.com/customers" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"

Когда я делаю тот же запрос с последней версией Firefox, я правильно получаю два запроса:

XX.XX.XX.XXX - - [10/May/2011:16:52:00 -0400] "GET /api/private/customers.json HTTP/1.1" 200 183 "https://sub.mycomain.com/customers" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
XX.XX.XX.XXX - - [10/May/2011:16:52:02 -0400] "GET /api/private/customers.json HTTP/1.1" 200 183 "https://sub.mycomain.com/customers" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

Такое поведение, по-видимому, не возникает при первом запросе, но все последующие запросы отправляются в двух экземплярах.,Кто-нибудь знает, что происходит?Попытки обнаружить дополнительные запросы в js были тщетными.

Ответы [ 3 ]

4 голосов
/ 15 января 2017

Полагаю, мы не узнаем, является ли это ошибкой или функцией ... В любом случае Safari (как и в версии 10.0.2) по-прежнему выполняет условный запрос , как объяснено Dan Manastireanu . Я обнаружил, что запрос не дублируется, - установить заголовок 'If-Unmodified-Since' с текущим временем запроса. (В качестве альтернативы вы также можете добавить параметр временной метки в URL, как уже упоминалось Дэн Манастиряну )

Я понизил setRequestHeader('Connection', "close"), потому что это запрещенное имя заголовка и выбросил ошибку Refused to set unsafe header "Connection".

Итак, основной запрос выглядит так:

var get = function(url, callbackSucess, callbackError) {
    var request = new XMLHttpRequest();
    request.open('GET', url, true);
    request.timeout = 10000;

    var now = new Date().getTime();
    request.setRequestHeader('If-Unmodified-Since', now);

    request.onreadystatechange = function() {
        if (request.readyState !== 4) {
            return;
        }
        if (request.status === 200) {
            callbackSucess(request.status);
        } else {
            callbackError(request.status);
        }
    };
    request.onerror = function (error) {
        callbackError(error);
    };
    request.ontimeout = function () {
        request.abort();
    };
    request.send(null);
}
3 голосов
/ 11 мая 2011

Я полагаю, что браузер отправляет условный запрос GET для второго вызова (см. Также 304 статус ответа ).

При первом вызове в браузере нет кэшированного ответа, поэтому он выполняет обычный запрос.
По второму запросу браузер сначала выполняет условный запрос GET, и, увидев, что его кэшированный ответ устарел, он должен повторить запрос GET.

Насколько я знаю, в jQuery есть встроенное исправление (он автоматически добавляет параметр в URL запроса, что-то вроде _=123456789). Я не знаю, почему это здесь не работает.

Вы можете попытаться добавить параметр запроса вручную так: '/api/private/customers.json?v='+(new Date().getTime())
Или вы можете попробовать использовать jQuery.ajax с cache:false и dataType:'jsonp'

Вы можете открыть Инструменты разработчика Safari (Веб-инспектор) и проверить вкладку Сеть. Он расскажет вам больше о запросе и ответе.

1 голос
/ 11 мая 2011

Добавление соединения : закрытие заголовка к ответу API решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...