从Restangular POST获得响应

时间:2013-06-16 17:40:25

标签: angularjs restangular

发送Restangular POST后如何获取响应对象?

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

我正在尝试获取新的对象ID。

感谢。

3 个答案:

答案 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;
            });
}

总结一下,有几点需要注意:

  1. Restangular可以获取成功回调中的响应对象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; }); } 部分)
  2. 如果使用方法then,restangular将会使用与objectA相同类型的响应进行成功回调(如果有)。
  3. 如果您想发布一个objectA但是获得一个响应对象B(不同类型),那么请使用方法.post(objectA)
  4. 重要:响应实际上是&#34; restangularized&#34;包裹&#34;真实&#34;的对象响应对象。这意味着响应包含一些restangular方法。如果您只是希望响应对象在响应上调用方法.customPOST(objectA),如我的第二个示例所示,其中响应实际上不是.plain()对象而是ITypeB