Организация обработки ответов RESTfull сервера
Добрый день.
Есть 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? Подскажите, пожалуйста. |
1) ресурсы у ангуляра сыроваты, добавил в них функцию парсера для разбора ответа
2) сервер возращает не только 200 статус, так что ошибки попадают по назначению 3) глобальный метод обработки ошибок
App.config(function( $httpProvider ) {
$httpProvider.responseInterceptors.push(function($q, $window, $rootScope, $location) {
return function(promise) {
return promise.then(function(response) {
// success
return response;
}, function(response) {
// error
return $q.reject(response);
});
}
});
где App ваше приложение |
Большое спасибо за ответ. Тем более с кодом.
Насколько я понимаю, в этот метод нельзя передать из контроллера имя свойства $scope, которое связано с представлением. Ответ сервера просто перехватывается этим методом. Хотелось бы писать так:
<div class = "form_error"> {{ formError }}</div>
|
если такой вывод ошибки у вас используется глобально, то вам ничего не мешает записывать ответ в $rootScope.formError
так как все $scope наследуются от $rootScope вывод можно таким и оставить. а если боитесь что где-то может переписываться, то сделайте так {{ $root.formError }} |
| Часовой пояс GMT +3, время: 02:52. |