7

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

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

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

谢谢。

4

3 回答 3

17

我是 Restangular 的创造者。弗利姆是对的:)。

在承诺中,您将获得从服务器返回的对象 :)

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

谢谢!

于 2013-06-19T06:21:04.923 回答
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
});
于 2013-06-17T07:48:03.263 回答
0

restangular POST 将期望与发布的对象相同的对象作为响应。

打字稿定义清楚地看到了这一点。假设我们有一个方法将接收一个类型的对象,ITypeA并将它发布到一个 url 中,如http://whatever/api/objects. 假设 REST api 返回一个 201 和一个 json,其响应对象可以相同或不同。在我们的例子中,假设返回的类型是ITypeB. 然后我们的 restangular 将无法使用标准的 POSTITypeA并期望得到响应ITypeB,因此下面的代码将不正确,因为restangular 会期望收到类型的响应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;
            });
}

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

  1. Restangular可以在成功回调中获取响应对象then部分)
  2. 如果使用该方法.post(objectA),restangular 将期望(如果有)成功的回调,其响应类型与 objectA 相同。
  3. 如果您想发布 objectA 但获得响应 objectB(不同类型),请使用该方法.customPOST(objectA)
  4. 重要提示:响应实际上是一个包装“真实”响应对象的“重新角化”对象。这意味着响应包含一些restangular方法。如果您只是希望响应对象调用响应.plain()上的方法,如我的第二个示例所示,其中响应实际上不是一个ITypeB对象,而是一个restangular.IElement
于 2016-04-28T21:42:47.940 回答