Добрый день.
Есть REST сервер, который всегда отвечает JSON вида:
{
code: 2, // код результата выполнения запроса. например 1 - ОК, 4 - запрошеный ресурс не существует, 9 - ошибка валидации и тп
data: [] // массив передаваемых данных
}
HTTP код ответа сервера всегда 200.
В Angular app есть сервисы:
angular.module('teslaApp.services', ['ngResource']).
value('uapi_dir', 'путь к API').
factory('Items', ['$resource', 'uapi_dir', function ($resource, uapi_dir) {
return $resource(uapi_dir + '/item/:id', {id: '@id'}, {
query: {method: 'GET', isArray: false},
update: {method: 'PUT'}
});
}]).
factory('Currency', ['$resource', 'uapi_dir', function ($resource, uapi_dir) {
return $resource(uapi_dir + '/currency/', {}, {});
}])
// еще порядка сорока сервисов по работе с ресурсами
;
В контроллерах работа с ресурсами идет приблизительно так:
Items.query(function (resp) {
// обработка удачного ответа
}, function (respErr) {
// обработка ошибки. если c REST сервером что-то не так.
});
Этот проект мне достался на "доделать" и пришлось срочно разбираться с Angular.
В написанном до меня коде в обработке удачных ответов REST (не удачные вообще не обрабатываются) стоит временная заглушка:
Items.query(function (resp) {
if (resp.code === 1) { // code 1 - ответ REST сервера, когда все ОК (аналог HTTP 200)
// дальше работа
}
}, function (respErr) {
});
Такая вот заглушка стоит везде. Само собой, надо разбирать остальные коды, выводить ошибки и тп.
Контроллеров много, работы с ресурсами в них, еще больше.
Нужна отдельная функция, которая будет смотреть code и писать ошибки куда-то в scope. Что-то типа такого:
// response - ответ REST
// msg_scope - $scope, куда надо поместить сообщение в зависимости от кода выполнения запроса
function restResponseHandler (response, msg_scope) {
var is_ok = true;
switch (response.code) {
case 8:
is_ok = false;
$scope[msg_scope] = 'Не верный логин или пароль';
break;
case 41:
// не авторизован
$location.path('/login');
break;
// и тд
}
return is_ok;
}
Из контроллера ее можно было-бо вызывать вот так:
Items.query(function (resp) {
if (restRespHandler(resp, 'formErr')) { // formErr - $scope.formErr -в него выводятся ошибки при работе с формой
// дальше работа
}
}, function (respErr) {
restRespHandler(resp);
});
Не самое изящное, но на ум пока лучше не приходит.
Где такой функции место, исходя из философии Angular? Это вроде не сервис (работа со scope) и не фильтр.
Может кто-то сталкивался?
Кто как общается с REST? Подскажите, пожалуйста.