2
[WARN][TiAPI   (  480)]  [REST API] apiCall  [object Object]
[WARN][TiAPI   (  480)]  [REST API TYPE] apiCall  POST
[WARN][TiAPI   (  480)]  [object Object]
[WARN][TiAPI   (  480)]  [REST API] apiCall  [object Object]
[WARN][TiAPI   (  480)]  [REST API TYPE] apiCall  PUT

当我第一次访问该服务时,该服务被调用为 POST 类型,但第二次它发送的是 PUT 而不是 POST。我如何才能真正使请求类型始终为 POST。

http://backbonejs.org/#Model-save

4

2 回答 2

2

Backbone 执行 POST 是因为它不知道将内容放置到的特定 URL。但是,当您事先知道 URL 时,PUT 是正确的方法。默认情况下,Backbone 使用“id”属性(如果存在)来构建 URL。因此,如果没有“id”,它假定您希望服务器填充它,如下所示:

=>
POST {"foo":"bar"} /things
<=
200 OK {"foo":"bar","id":"a36f933"}

但是,如果您在客户端生成 id,或者如果您已经知道 id,Backbone 将执行 PUT,并假定服务器将接受它,如下所示:

=>
PUT {"foo":"bar","id":"12345abc"} /things/12345abc
<=
200 OK {"foo":"bar","id":"12345abc"}

这完全符合 RESTful URL 的工作方式以及非幂等 POST 请求与幂等 PUT 请求背后的意图和含义。如果您了解幂等性,Backbone 的行为就开始有意义了 :)

http://en.wikipedia.org/wiki/幂等性

http://quoderat.megginson.com/2011/11/17/post-put-idempotence-and-self-identification/

于 2013-02-28T01:34:41.093 回答
1

默认情况下, Backbone用于CRUD与数据端点同步。这意味着第一个 API 调用是一个POST(用于创建操作),然后,在第二次调用时,由于模式有一个id,Backbone 将发送一个PUT(用于更新操作)

要强制使用POST,您需要覆盖Backbone.sync

于 2013-02-28T01:14:55.560 回答