with resource headers example data angularjs coffeescript

angularjs - headers - ¿Cómo uso transformRequest y transformResponse para modificar los datos de un $ resource?



headers angularjs (2)

Estoy utilizando una API compatible con JSONAPI , y uno de los requisitos de formato es que todos los datos (entrantes y salientes) deben estar envueltos en un objeto de data . Así que mi solicitud se ve como:

{ "data": { "email": "[email protected]", "password": "pass", "type": "sessions" } }

Y mi respuesta se ve como:

{ "data": { "user_id": 13, "expires": 7200, "token": "gpKkNpSIzxrkYbQiYxc6us0yDeqRPNRb9Lo1YRMocyXnXbcwXlyedjPZi88yft3y" } }

En mi controlador, al realizar una nueva solicitud de sesión, tengo:

$scope.signin = -> session = new Session email: $scope.user.email password: $scope.user.password session.$save() console.log session console.log session.token if not session.token alert ''Invalid Login'' else $rootScope.session_token = session.token $state.go ''app.dashboard''

Y mi Session es una fábrica que se parece a:

angular.module(''webapp'').factory ''Session'', [ ''$resource'' ($resource) -> $resource ''http://localhost:9500/v1/sessions'', id: ''@id'' , save: method: ''POST'' transformRequest: (data) -> result = data: JSON.parse JSON.stringify data result.data.types = ''sessions'' result = JSON.stringify result result transformResponse: (data) -> result = JSON.parse data a = JSON.parse JSON.stringify result.data console.log a a

La solicitud está bien. El formato y el análisis parece funcionar. Sin embargo, la respuesta, cuando log se muestra como un Resource , no un Object . Y session.token muestra como indefinido a pesar de que el servidor está devolviendo datos válidos.

¿Cómo modifico mi transformResponse para tener en cuenta esto?


¿Puedo sugerir un interceptor XHR?

xhrInterceptor.js :

(function (app) { "use strict"; function XhrInterceptor($q) { return { request: function requestInterceptor(config) { var data = config.data; if (data && config.method === "POST") { config.data = { data: data }; } return config || $q.when(config); }, response: function responseInterceptor(response) { if (typeof response === "object") { if (response.config.method === "POST") { response.data = response.data.data || {}; } } return response || $q.when(response); } }; } app .factory("app.XhrInterceptor", ["$q", XhrInterceptor]); })(window.app);

app.js :

En su fase de configuración, u otra lógica de inicialización, agregue el interceptor de respuesta.

app .config(["$httpProvider", function ($httpProvider) { $httpProvider.interceptors.push("app.XhrInterceptor"); });

Más información

Interceptor XHR en una aplicación web AngularJS

Intercepte solicitudes XHR / Ajax con AngularJS http


Creo que lo que quieres es capturar tu respuesta de Recursos con una promesa:

session.$save().$promise.then(function (result) { console.log (result); });