Árvore de páginas

Alguns produtos podem especificar um padrão para retorno de todas as chamadas de serviços. Nestes casos é preciso customizar o retorno das requisições HTTP para que fiquem adequadas ao padrão REST implementado pelo AngularJS Resource.

Na aplicação de referencia está sendo utilizado um dos padrões identificado, no qual todas as requisições HTTP (REST) para serviços de dados com retorno no formato JSON são encapsuladas em um objeto do tipo Return contendo a seguinte estrutura:

  • data: objeto genérico que pode conter um único objeto ou uma lista de objetos.

  • length: utilizado normalmente para quando o objeto contido no 'data' é do tipo lista e possui paginação; neste caso a propriedade length recebe a quantidade total de registros da consulta;

  • messages: lista de mensagens de erro ou informativo resultante do serviço:

    • type: danger, error, warning, question e info;
    • code: titulo ou código da mensagem;
    • detail: detalhamento ou texto da mensagem.


Observação: Devido a padronização do retorno das requisições é possível identificar quando a requisição retorno alguma notificação ou mensagem sendo possível exibi-la automaticamente ao usuário, eximindo o desenvolvedor de ter que trata-la manualmente.

Definição

A implementação da transformação de resposta consistem em sobrescrever a função transformResponse do $httpProvider do AngularJS. Ao sobrescrever esta função temos a possibilidade de manipular o resultado de todas as requisições HTTP e realizar diversos tratamentos como a exibição das notificações ou mensagens e de realizar o tratamento de uma resposta customizada antes de disparar o evento de sucesso da requisição.

Para isto é preciso criar uma função que irá receber o $httpProvider como paramentro e sobrescrever a função default 'transformResponse':

Exemplo
appHTTPConfig.$inject = ['$httpProvider'];
function appHTTPConfig($httpProvider) {
	
	$httpProvider.defaults.transformResponse = function (data, headers) {

		// Todas as requisições que não retornem o resultado no padrão JSON
		// devem ser desconsideradas. Outros tipos de protocolos devem ser 
		// tratados separadamente.
		if (headers('content-type') != "application/json") return data;

		// Realiza o parser do resultado para um objeto do tipo JSON;
		var decodeddata = $("<div/>").html(data).text();
		var obj = angular.fromJson(decodeddata);

		// Verifica se o objeto possui um atributo do tipo messages para tratamento
		// automático de mensagens e notificações através de eventos.
		if (obj.hasOwnProperty('messages')) {
		
			...
			
		}

		// Verificar se o objeto possui a estrutura padrão do Return implementada
		// pelo servidor para realização do tratamento de equivalência do objeto Return a
		// o padrão das chamadas REST.
		if (obj.hasOwnProperty('data') 
			&& obj.hasOwnProperty('length') 
			&& obj.hasOwnProperty('messages')) {

			...
		}
		
		// Quando não se tratar de um objeto do tipo Return na requisição retornar o objeto completo.
		return obj;
	};

	// Adiciona o appHTTPInterceptors ao HTTP Provider.
	$httpProvider.interceptors.push('appHTTPInterceptors');	
}

// Registra a configuração HTTP customizadas para o App.
index.config(appHTTPConfig);

A implementação completa se encontra na aplicação de referencia no arquivo config-http.js

  • Sem rótulos