2015-04-08 7 views
16

Sto utilizzando un'API compatibile con JSONAPI e uno dei requisiti di formato è che tutti i dati (in entrata e in uscita) devono essere racchiusi in un oggetto data. Quindi la mia richiesta si presenta come:

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

E la mia risposta si presenta come:

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

Nel mio controller, quando si effettua una nuova richiesta di sessione, ho:

$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' 

E il mio Session è una fabbrica che assomiglia 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 richiesta va bene. La formattazione e l'analisi sembrano funzionare. Tuttavia, la risposta, quando I log viene visualizzata come Resource, non Object. E session.token viene visualizzato come non definito anche se il server restituisce dati validi.

Come modificare il mio transformResponse per tener conto di ciò?

+0

Hmm? 'data: JSON.parse JSON.stringify data' perché lo stai facendo? –

+1

Devi capire che 'session. $ Save()' è asincrono, quindi 'console.log session.token' sarà chiamato immediatamente e sarà sempre indefinito finché la richiesta' session. $ Save() 'non viene risolta. –

+0

Ho provato ad usare anche la promessa '.then' e lo stesso risultato è avvenuto – Shamoon

risposta

7

penso che ciò che si vuole è quello di catturare la vostra risposta delle risorse con una promessa:

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

Potrebbe anche essere cambiato in 'sessione. $ Save (function (result) {// successCallback})' – akn

3

Posso suggerire un intercettore 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:

con il tuo fase di configurazione, o altra logica di inizializzazione, aggiungere l'intercettore risposta.

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

Ulteriori informazioni

XHR Interceptor in an AngularJS web app

Intercept XHR/Ajax requests with AngularJS http

Problemi correlati