使用restangular保存方法调用put vs post时的控制?

时间:2015-03-27 16:38:46

标签: javascript restangular

我正在使用正则化元素并尝试保存它。如果它是一个新元素,它将以我想要的格式调用post。

但是,对于已更改的现有元素,它会尝试调用put。我正在使用的其余接口没有put命令,而是使用带有元素id的post来更新该元素。

是否有一种简单的方法可以让save方法实现我希望它使用post,使用元素id,而不是在我调用save方法时使用它?我是否必须完全覆盖该方法?

顺便说一句,我最好能告诉矩形使用POST来表示新元素,如果元素以前存在过PUT,但我不确定。任何人都可以告诉我矩形决定哪个电话适合吗?文档只是说它将'决定'要调用哪个。

编辑:

我找到了一个非常简单的解决方案,在我的情况下效果很好,因为我们连接的REST接口没有在任何地方使用PUT。我将以下行添加到初始化工厂中:

Restangular.setMethodOverriders(["put", "post"]);

实际上这改变了每次调用一个帖子调用。由于我们的格式很安静,其他的不使用Puts,这很好用。我们现在可以简单地在任何restangularized元素上调用save,它就会起作用。

1 个答案:

答案 0 :(得分:2)

我检查了Restangular source,发现了以下内容:

  function save(params, headers) {
    if (this[config.restangularFields.fromServer]) {
      return this[config.restangularFields.put](params, headers);
    } else {
      return _.bind(elemFunction, this)('post', undefined, params, undefined, headers);
    }
  }

因此,Restangular与您创建和重新组合的javascript对象以及通过Restangular方法获得的对象(get方法的风格)不同。如果它是第一个使用POST的,因为在本地重新组合元素意味着它不存在于远程位置。在第一次保存后,或者如果您从远程源提取它,它将使用PUT

此行为非常适合REST,因为用于创建对象的POST和用于更新的PUT是REST API的常用方法。有关示例,请参阅this section from Wikipedia on REST

根据您的具体情况,(至少)有以下两种解决方案:

更新API以允许PUTs获取更新(如果您有权访问),或者通常使用重新分类元素的post方法。我建议不要直接更改config.restangularFields.fromServer字段或覆盖Restangular的save方法(尽管两者都应该有效)。