我正在使用Ember.js应用。我有一个更新函数,它是ObjectController的一部分。
该函数应保存我更新的模型,但是当我调用save();
时,它会发送POST请求而不是PUT请求。 (在Chrome中测试过。)
为什么会这样?如何确保发送更新的PUT请求?
这是我的代码:
customer = this.get('model');
customer.set('name', 'New name');
customer.save();
如需额外参考,当我记录" dirtyType" console.log( customer.get('dirtyType') );
表示"已更新"。
非常感谢任何帮助!
我已经调整了上面的示例代码以使其更清晰,我不是在创建新模型并且想要使用PUT。我有一个我需要更新的现有模型。
答案 0 :(得分:1)
我不确定您的解决方法在PUT与POST之间是否正确。
TL; DR PUT应该定义资源(通过Request-URI),但我们在创建过程中不这样做,因此我们不应该使用POST。如果您的服务器需要这样做,请覆盖创建/保存,而不是攻击isNew
属性,这可能会让您感到厌烦。
9.6 PUT
PUT方法请求将所包含的实体存储在 提供了Request-URI。如果Request-URI引用已经 现有资源,封闭实体应该被视为一个 驻留在源服务器上的修改版本。如果 Request-URI不指向现有资源,URI也是 能够被请求用户定义为新资源 代理,源服务器可以使用该URI创建资源。如果一个 创建新资源后,源服务器必须通知用户代理 通过201(创建)回复。如果修改了现有资源, 应该发送200(OK)或204(No Content)响应代码 表示请求成功完成。如果资源 无法使用Request-URI创建或修改 错误回应应该给出反映出来的性质 问题。实体的接收者不得忽略任何内容 - * (例如,Content-Range)标头,它不理解或实现 并且在这种情况下必须返回501(未实现)响应。
如果请求通过缓存并且Request-URI标识 一个或多个当前缓存的实体,这些条目应该是 被视为陈旧。对此方法的响应不可缓存。
POST和PUT请求之间的根本区别在于 反映在Request-URI的不同含义中。一个中的URI POST请求标识将处理随附的资源 实体。该资源可能是一个数据接受过程,一个网关 一些其他协议,或接受注释的单独实体。 相反,PUT请求中的URI标识所包含的实体 与请求 - 用户代理知道什么URI的意图和 服务器绝不能尝试将请求应用于其他资源。 如果服务器希望将请求应用于其他URI,
App.ApplicationAdapter = DS.RESTAdapter.extend({
createRecord: function(store, type, record) {
var data = {};
var serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data, type, record, { includeId: true });
//return this.ajax(this.buildURL(type.typeKey), "POST", { data: data });
return this.ajax(this.buildURL(type.typeKey), "PUT", { data: data });
},
updateRecord: function(store, type, record) {
var data = {};
var serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data, type, record);
var id = get(record, 'id');
// you could do the same here, but it's even more incorrect
return this.ajax(this.buildURL(type.typeKey, id), "PUT", { data: data });
},
});
答案 1 :(得分:1)
感谢所有帮助人员,不过我找到了这个问题并且这是非常愚蠢的。
我一直使用的API有一个新标志" is_new"并且已经添加到模型中并覆盖了#34; isNew"属性。
导致Ember(和我)变得非常困惑。
我已经调整了API,一切都很好!
答案 2 :(得分:0)
如果模型是使用createRecord创建的,因此具有isNew == true
并且您调用save()
,则预期行为为POST
。一旦记录被保留,并且记录被更改,因此isDirty == true
只有isNew == false
,那么save()
将是PUT
。
Models Guide中描述了这一点。