2013-06-16 12 views
7

Come ottengo l'oggetto risposta dopo aver inviato un POST Restangular?Richiesta di risposta da POST Restangular

firstAccount.post("Buildings", myBuilding).then(function() { 
    console.log("Object saved OK"); 
}, function() { 
    console.log("There was an error saving"); 
}); 

Sto cercando di ottenere il nuovo ID oggetto.

Grazie.

risposta

17

Sono il creatore di Restangular. Flim ha ragione :).

Nella promessa poi si ottiene l'oggetto restituito dal server :)

firstAccount.post("Buildings", myBuilding).then(function(addedBuilding) { 
    console.log("id", addedBuilding.id); 
}, function() { 
    console.log("There was an error saving"); 
}); 

Grazie!

+1

sei sicuro che sia la risposta reale? Ho un endpoint api che restituisce dati diversi da quello inviato. sul promissivo sto ricevendo gli stessi dati inviati su 'post', compresi i metodi restangular e tutti. –

+0

Ehi. Il metodo Restangular viene effettivamente aggiunto a tutte le risposte del server. Questo fa parte di ciò che lo rende grande. Che tutti i tuoi oggetti che ricevi siano migliorati per essere usati con Restangular. Se il tuo post non restituisce alcunché dal server, in realtà sto restituendo lo stesso oggetto che hai postato in modo da ottenere qualcosa. Quindi, se stai ottenendo esattamente gli stessi dati che stai postando, controlla di restituire i dati dal server OK. – mgonto

+0

Ho notato questo perché l'API restituisce i dati in un formato diverso da quello che riceve. Esempio: riceve '{'category': 'asd'}' e restituisce '{category: {id: 1, name: 'asd'}'. Ha funzionato su ngResource, ma quando mi sono spostato su restangular l'applicazione si è rotta perché la risposta è arrivata come '{'category': 'asd'}'. –

2

Non ho lavorato direttamente con Restangular, ma il tuo POST probabilmente deve restituire un oggetto JSON con l'ID. Quindi, la tua funzione di successo deve accettarlo come parametro.

firstAccount.post("Buildings", myBuilding).then(function(resp) { 
    console.log(resp.id); // if the JSON obj has the id as part of the response 
}); 
0

Un POST restangolare si aspetta lo stesso oggetto in risposta rispetto a quello pubblicato.

Questo è chiaramente visto con le definizioni di dattiloscritto. Supponiamo di avere un metodo che riceverà un oggetto di tipo ITypeA e lo invierà in un URL come http://whatever/api/objects. Supponiamo che l'API REST restituisca 201 e anche un json con l'oggetto risposta che può essere lo stesso O DIVERSO. Nel nostro caso, supponiamo che il tipo restituito sia ITypeB. Quindi il nostro restangular non sarà in grado di utilizzare un POST standard di ITypeA e si aspetta una risposta di ITypeB, quindi il codice seguente non sarà corretto in quanto restangular dovrebbe ricevere una risposta di tipo ITypeA (uguale a quella pubblicata).

public postAnObject(objectToPost: models.ITypeA): ng.IPromise<models.ITypeB> { 
    return this.restangular.all("objects") 
      .post<models.ITypeA>(objectToPost) 
      .then((responseObject: models.ITypeB) => { 
       return responseObject; 
      }, (restangularError: any) => { 
       throw "Error adding object. Status: " + restangularError.status; 
      }); 
} 

che può essere risolto utilizzando un customPOST, in modo che il codice di cui sopra sarebbe corretto in questo modo:

public postAnObject(objectToPost: models.ITypeA): ng.IPromise<models.ITypeB> { 
    return this.restangular.all("objects") 
      .customPOST(objectToPost) 
      .then((restangularizedObjectTypeB: restangular.IElement) => { 
       return restangularizedObjectTypeB.plain(); 
      }, (restangularError: any) => { 
       throw "Error adding object. Status: " + restangularError.status; 
      }); 
} 

Ci sono alcune cose da notare, in sintesi:

  1. Restangular can ottiene l'oggetto risposta nella richiamata con successo (la parte then)
  2. Se si utilizza il metodo .post(objectA) restangular, si attenderà, se presente, una richiamata di successo con una risposta dello stesso tipo dell'oggettoA.
  3. Se si desidera pubblicare un Objecta ma ottenere una risposta ObjectB (tipi diversi) quindi utilizzare il metodo .customPOST(objectA)
  4. IMPORTANTE: la risposta è in realtà un oggetto "restangularized" che avvolge l'oggetto di risposta "reale". Ciò significa che la risposta contiene alcuni metodi restangular. Se si desidera semplicemente l'oggetto risposta chiamare il metodo .plain() sulla risposta, come mostrato nel mio secondo esempio in cui la risposta non è in realtà un oggetto, ma un ITypeBrestangular.IElement
Problemi correlati