Получение ответа от Restrict POST
Как я могу получить объект ответа после отправки Restrict POST?
firstAccount.post("Buildings", myBuilding).then(function() {
console.log("Object saved OK");
}, function() {
console.log("There was an error saving");
});
Я пытаюсь получить новый идентификатор объекта.
Благодарю.
3 ответа
Я создатель Restangular. Флим прав:).
В обещании вы получите объект, возвращенный с сервера:)
firstAccount.post("Buildings", myBuilding).then(function(addedBuilding) {
console.log("id", addedBuilding.id);
}, function() {
console.log("There was an error saving");
});
Спасибо!
Я не работал непосредственно с Restangular, но ваш POST, вероятно, должен вернуть объект JSON с идентификатором. Затем ваша функция успеха должна принять его в качестве параметра.
firstAccount.post("Buildings", myBuilding).then(function(resp) {
console.log(resp.id); // if the JSON obj has the id as part of the response
});
Ограниченный POST будет ожидать того же объекта в ответ, чем отправленный.
Это хорошо видно по машинописным определениям. Предположим, у нас есть метод, который собирается получить объект типа ITypeA
и он собирается разместить его в URL, как http://whatever/api/objects
, Предположим, что API REST возвращает 201, а также json с объектом ответа, который может быть одинаковым ИЛИ РАЗНЫМ. В нашем случае предположим, что возвращаемый тип будет ITypeB
, Тогда наш ограниченный не сможет использовать стандартный POST ITypeA
и ожидать ответа ITypeB
, поэтому следующий код не будет корректным, поскольку ожидаемый ответ будет получать ответ типа ITypeA
(так же, как тот, который размещен).
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;
});
}
Это можно решить с помощью customPOST, поэтому приведенный выше код будет корректным, например, так:
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;
});
}
Вкратце следует отметить несколько вещей:
- Restangular может получить объект ответа в успешном обратном вызове (
then
часть) - При использовании метода
.post(objectA)
restangular будет ожидать, если таковые имеются, успешный обратный вызов с ответом того же типа, что и objectA. - Если вы хотите опубликовать objectA, но получить ответ objectB (разных типов), используйте метод
.customPOST(objectA)
- ВАЖНО: ответ на самом деле является "ограниченным" объектом, который оборачивает "реальный" объект ответа. Это означает, что ответ содержит некоторые ограничительные методы. Если вы просто хотите, чтобы объект ответа вызывал метод
.plain()
на ответ, как показано в моем втором примере, где ответ на самом деле неITypeB
объект ноrestangular.IElement