发送Restangular POST后如何获取响应对象?
firstAccount.post("Buildings", myBuilding).then(function() {
console.log("Object saved OK");
}, function() {
console.log("There was an error saving");
});
我正在尝试获取新的对象ID。
感谢。
答案 0 :(得分:17)
我是Restangular的创造者。弗利姆是对的:)。
在承诺中,您将获得从服务器返回的对象:)
firstAccount.post("Buildings", myBuilding).then(function(addedBuilding) {
console.log("id", addedBuilding.id);
}, function() {
console.log("There was an error saving");
});
谢谢!
答案 1 :(得分:2)
我没有直接使用Restangular,但你的POST可能需要返回一个带有ID的JSON对象。然后,您的成功函数必须接受它作为参数。
firstAccount.post("Buildings", myBuilding).then(function(resp) {
console.log(resp.id); // if the JSON obj has the id as part of the response
});
答案 2 :(得分:0)
一个重新定位的POST将期望响应的对象与发布的对象相同。
使用打字稿定义可以清楚地看到这一点。假设我们有一个方法将接收char *S1 = std::getenv("SystemDrive");
char *S2 = std::getenv("USERNAME");
strcat(S1,"\\\\Users\\\\");
strcat(S1,S2);
strcat(S1,"\\\\");
strcat(S1,"Documents");
类型的对象,并且它将在ITypeA
这样的网址中发布它。假设REST api返回201并且json与响应对象返回相同或不同的响应对象。在我们的例子中,假设返回的类型为http://whatever/api/objects
。
然后我们的restangular将无法使用ITypeB
的标准POST并期望得到ITypeA
的响应,因此以下代码不会正确,因为restangular预计会收到类型的响应ITypeB
(与发布的相同)。
ITypeA
这可以通过使用customPOST来解决,所以上面的代码是这样的:
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;
});
}
总结一下,有几点需要注意:
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;
});
}
部分)then
,restangular将会使用与objectA相同类型的响应进行成功回调(如果有)。.post(objectA)
.customPOST(objectA)
,如我的第二个示例所示,其中响应实际上不是.plain()
对象而是ITypeB