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
Creo que lo que quieres es capturar tu respuesta de Recursos con una promesa:
session.$save().$promise.then(function (result) {
console.log (result);
});