backbone.js服务调用更改了请求类型

时间:2013-02-28 01:07:23

标签: javascript backbone.js

[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

2 个答案:

答案 0 :(得分:2)

Backbone会执行POST,因为它不知道将PUT提供给的具体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/Idempotence

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

答案 1 :(得分:1)

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

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