我正在使用AngularJS 1.2.1的ngResource,我正在尝试将null
作为PUT请求中参数的值发送。不幸的是,当它被设置时,Angular将忽略它的参数而不发送它。
以下是一些示例代码:
var User = $resource('/comments/:id', {id:'@id'}, {
destroy: { method: 'PUT', params: {content: null} }
});
var user = User.destroy({id:123}, function() {});
Angular将忽略content
而不发送密钥或空值。
如何让Angular发送null?
答案 0 :(得分:3)
正如Lèse所指出的,javascript类型null
不是URL参数的有效值。
javascript null
值与字符串'null'
不同。因此,如果您希望自己的网址看起来像/comments/123?content=null
,只需提供字符串'null'
即可。 URL参数不是JSON,javascript中的null
值与content=null
的含义不同,因为在后一种情况下,null将被任何给定的服务器解释为字符串值。
Angular的$ http服务filters out null and undefined values in the params object before constructing a url with them,因为没有标准的方法将undefined
作为“值”发送到服务器。它没有意义。但是,如果您想发送一个像'undefined'
或'null'
这样的字符串,那么它很好,但它需要在服务器端实现解释它。
如果您正在发出PUT
请求,为什么您的某些数据在资源中被JSON序列化,而其中一些数据是通过URL参数发送的?也许示例代码的代表性很差,但在该示例中,您发送的PUT
请求的响应正文为{"id": 123}
,网址为/comments/123
。这不是多余的吗?为什么不将JSON字符串中的content
属性和数据发送到服务器?然后它实际上具有您正在寻找的null
值,因为JSON字符串可以表示null
类型值。此外,如果您要删除/销毁记录,为什么不使用DELETE
请求,而是使用PUT请求别名化destroy方法?
那么为什么不这样呢?我不确定User
与它有什么关系......
var Comment = $resource('/comments/:id', {id: @id}, {
destroy: {method: 'PUT'}
});
new Comment({id: 123, content: null}).$destroy();
答案 1 :(得分:0)
自我的问题以来所做的评论意味着不应发送null
,因为它无法正确封装在HTTP参数中。但是,它可以封装在JSON中。为什么有人想发送空值?因为向upsert
[1]端点发送null意味着销毁。遗憾的是,无法在content
调用中将.destroy()
的默认值定义为空。
我解决的答案是:
var Comment = $resource('/comments/:id', {id:'@id'}, {
destroy: { method: 'PUT' }
});
var comment = Comment.destroy({id:123, content: null});
这就像@ jbielick的答案一样,他做得很好,解释了它不能作为默认参数工作的原因,但如果它是作为JSONify的输入对象的一部分提供的话。