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

control when put vs post is called with restangular save method?

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

但是,对于已更改的现有元素,它会尝试调用 put。我正在使用的其余界面没有放置命令,而是使用 post 和元素 ID 来更新该元素。

有没有一种简单的方法可以让保存方法意识到我希望它使用 post 和元素 id,而不是在我调用保存方法时放置?我必须完全覆盖该方法吗?

顺便说一句,我能说出矩形对新元素使用 POST,如果该元素以前存在则 PUT,但我不确定。谁能告诉我矩形如何决定哪个调用是合适的?文档只是说它将 'decide' 调用。

编辑:

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

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

实际上这改变了每个 将调用变为post 调用。因为我们的格式是 restful,所以除了不使用 Puts 之外,这很有效。我们现在可以简单地在任何重新规范化的元素上调用保存,它就会正常工作。

我检查了 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 方法(尽管两者都应该有效)。