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:
- Restangular can ottiene l'oggetto risposta nella richiamata con successo (la parte
then
)
- Se si utilizza il metodo
.post(objectA)
restangular, si attenderà, se presente, una richiamata di successo con una risposta dello stesso tipo dell'oggettoA.
- Se si desidera pubblicare un Objecta ma ottenere una risposta ObjectB (tipi diversi) quindi utilizzare il metodo
.customPOST(objectA)
- 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 ITypeB
restangular.IElement
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. –
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
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'}'. –