Доступ к коду состояния http из Ext.data.Store

У меня есть http API, который (шокирующе новая техника) реагирует на разные ошибки, устанавливая разные статусы ответа.

Вопрос в том, что при использовании Ext.data.Store с некоторым прокси-сервером XMLHttpRequest внутри, как лучше всего обрабатывать эти статусы? Насколько я понимаю, событие "загрузка" не передает статус напрямую, как и "исключение", а последнее фактически даже не срабатывает при получении статуса 4**.

Итак, как я вижу из кода, экземпляр xhr скрыт от Ext.data.store, поэтому вопрос также можно сформулировать как «Как лучше всего использовать extjs для обработки низкоуровневого объекта xhr».


person shabunc    schedule 21.09.2011    source источник


Ответы (3)


В Ext.data.Store нет события exception. Вместо этого Ext.data.proxy.Server и его подклассы (например, Ext.data.proxy.Ajax) определяют событие-исключение. Слушатели получают объект ответа, который включает статус http.

В зависимости от вашей настройки вы можете зарегистрировать прослушиватель на прокси-сервере магазина или, если ваш магазин использует модель, на прокси-сервере модели.

Эта тестовая установка работала для меня в Chrome 14 и FF 6:

var store = Ext.create('Ext.data.Store', {
    fields: [ 'field1', 'field2'],

    proxy: {
        type: 'ajax',
        url: 'api/data.json',
        reader: {
            type: 'json',
            root: 'data'
        },
        listeners: {
            exception: function(proxy, exception, operation) {
                console.log(response.status);
            }

        }
    },
});
store.load(); 
person mistaecko    schedule 22.09.2011
comment
проголосовали против - если вы говорите об исключении - и я думаю, что речь идет о йоге - вы просто не читали вопрос. - person shabunc; 22.09.2011
comment
Возможно, вы не читали ответы ;) Дело в том, что в Ext 4.0.2a прокси запускает событие exception, которое также запускается в случае, если сервер возвращает код состояния http 4xx. Я обновил свой ответ, может быть, теперь он вам больше поможет. - person mistaecko; 22.09.2011
comment
исключение запускается со следующими статусами - 12002, 12029, 12030, 12031, 12152, 13030 - см. функцию parseStatus. Если я не прав, поправьте меня, пожалуйста. Я проголосовал за вас, если ваш ответ окажется правильным, я отмечу его как правильный. - person shabunc; 22.09.2011
comment
Теперь я лучше понимаю, с чем вы имеете дело. Однако 5-значные коды состояния HTTP не совсем соответствуют RFC 2616 (это какое-то сумасшествие MS, верно?). Если вы уже видели Ext.data.Connection#onComplete и #parseStatus, то знаете, что эти специальные 5-значные коды не передаются в свойство response.status (по каким-то причинам!?). - person mistaecko; 22.09.2011
comment
Ваш вопрос должен быть обновлен, чтобы явно указать эти специальные несовместимые коды состояния HTTP. Кроме того, вы должны пересмотреть свое утверждение, в котором говорится: «... а также исключение, и последнее фактически даже не срабатывает при получении статуса 4 **», что ИМХО неверно для Ext 4.0.2a . Я также собираюсь обновить свой вопрос еще раз, чтобы наметить возможное решение вашей проблемы. - person mistaecko; 22.09.2011
comment
мы не понимаем друг друга, если честно))) Мой вопрос касается получения стандартного кода состояния. Насколько я понимаю, нет возможности отслеживать http-статусы, прослушивая какое-то событие в Evt.data.Store. Если есть, поправьте меня. - person shabunc; 22.09.2011
comment
Ладно, опять недоразумение. Я думал, что в комментарии № 3 вы утверждаете, что ваш сервер отвечает этими (5-значными) кодами. Однако, если я вас правильно понял, вы имели в виду, что ваша интерпретация кода Ext заключается в том, что «исключение запускается [только] со следующими статусами ..». Это неправильно. Если вы посмотрите на Connection#onComplete, вы увидите, что соответствующее выражение IF оценивает свойство success, а не свойство isException. Вы могли бы легко убедиться в этом, запустив тестовый пример, который я предоставил, который, как я полагаю, вы не удосужились сделать. - person mistaecko; 22.09.2011
comment
Просто для ясности. Событие исключения на прокси-сервере сработает точно в той же ситуации, что и событие requestException на Ext.Ajax. То есть, если либо свойство успеха ответа равно false, либо код состояния HTTP отличается от 2xx. Поскольку регистрация прослушивателя на Ext.Ajax будет срабатывать для каждого сделанного запроса (и вы прокомментировали ответ suknic, что хотите, чтобы он был специфичен для вашего магазина), я предложил решение зарегистрировать прослушиватель на прокси-сервере магазина. Это будет срабатывать только для исключений, вызванных запросами из этого хранилища. - person mistaecko; 22.09.2011

Событие-исключение действительно предоставляет объект response, который имеет свойство status, содержащее код состояния HTML, который вы хотите видеть.

Если ваше исключение действительно не срабатывает из-за ошибок 4 ** (которые, по моему опыту, срабатывают), вы можете вместо этого попытаться зарегистрировать прослушиватель ajax:

Ext.Ajax.on('requestexception', exceptionHandlerMethod);

и

function exceptionHandlerMethod(connection, response, requestOptions, listenerOptions) {
    if(response.status == 401) {
        alert('401 error');
    }
}
person suknic    schedule 21.09.2011
comment
спасибо за этот ответ. Насколько я понимаю, Ext.Ajax — это экземпляр Ext.data.Connection. Но как я могу получить доступ к определенному соединению в Ext.data.Store? Я хочу использовать Ext.data.Store и как-то обрабатывать некоторые состояния, зависящие от ответа. - person shabunc; 21.09.2011
comment
ну, теперь я лучше понимаю лежащую в основе идеологию. Большое спасибо. - person shabunc; 21.09.2011

Использование extjs 5.1

Хранилище/прокси может получить доступ к каждому HTTP-коду и заголовку ответа, прослушивая события «beginprocessresponse» или «endprocessresponse».

proxy: {
    // snip

    listeners: {
        beginprocessresponse: 'onResponse'
    }

    onResponse: function(store, response, operation) {
         console.log('prior to reader');
         console.log(response.getAllResponseHeaders());
    }
}

Мне любопытно, как EventDomain играет роль в сочетании между Ext.Ajax, Proxy, Reader и Store.

person Stevko    schedule 10.03.2015