Angular 1.3.0 учитывает ответы JSON, как мне переопределить это или предварительно проанализировать ответ перед Angular?

В последнем выпуске Angular (v1.3.0) они добавили исправление для заголовка типа контента для application/json. Теперь все мои ответы получают ошибку, потому что они недействительны в формате JSON. Я знаю, что должен изменить серверную часть, чтобы она отвечала простым текстовым заголовком, но в данный момент я не могу это контролировать. Есть ли способ предварительно проанализировать ответ до того, как Angular попытается его проанализировать?

я думаю, что они сделали это исправление: https://github.com/angular/angular.js/commit/7b6c1d08aceba6704a40302f373400aed9ed0e0b

Моя проблема заключается в том, что ответ, который я получаю от серверной части, имеет префикс защиты, который не соответствует тому, который проверяет Angular.

Я попытался добавить перехватчик http в конфигурацию, но это не помогло, все еще анализирует сам Angular.

$httpProvider.interceptors.push('parsePrefixedJson');

Ошибка, которую я получаю в своей консоли (она возникает из-за десериализации строки JSON в Angular):

SyntaxError: Unexpected token w
at Object.parse (native)
at fromJson ...

person KungWaz    schedule 15.10.2014    source источник


Ответы (2)


Вы должны использовать

$http.defaults.transformResponse

Вы также не хотите использовать .push(). Вам нужно, чтобы ваш преобразователь делал свое дело раньше, чем угловые преобразователи по умолчанию. Вместо этого вы должны использовать .unshift().

Итак, ваш код должен быть

$http.defaults.transformResponse.unshift(transformResponse);

где transformResponse — это функция, которая преобразует ответ сервера в правильный JSON.

person Tom Teman    schedule 16.02.2015

Я нашел способ изменить преобразователь по умолчанию, добавив это в приложение Angular:

app.run(['$http',
    function($http) {
        var parseResponse = function(response) {
            // parse response here

            return response;
        };

        $http.defaults.transformResponse = [parseResponse];
    }
]);

Это переопределит поведение по умолчанию, вы также можете установить его как пустой массив, если нужно преобразовать только выбранные ответы.

См. этот вопрос/ответ: https://stackoverflow.com/questions/18147126/angularjs-http-and-transformresponse

person KungWaz    schedule 15.10.2014