Javascript 将null作为ngResource AngularJS中的值发送

Javascript 将null作为ngResource AngularJS中的值发送,javascript,ajax,angularjs,angularjs-resource,Javascript,Ajax,Angularjs,Angularjs Resource,我正在使用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}, functio

我正在使用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将忽略
内容
,不发送键或空值


如何使Angular send为null?

正如Lèse所指出的,javascript类型
null
不是URL参数的有效值

javascript
null
值与字符串
'null'
不同。因此,如果您希望您的URL看起来像
/comments/123?content=null
,只需提供一个字符串
'null'
。URL参数不是JSON,javascript中的
null
值与
content=null
的含义不同,因为在后一种情况下,任何给定的服务器都会将null解释为字符串值

Angular的$http服务是因为没有标准化的方法将
未定义的
作为“值”发送到服务器。这根本没有道理。但是,如果您想发送一个字符串,如
'undefined'
'null'
,这很好,但它需要在服务器端实现来解释它

如果您正在发出一个
PUT
请求,为什么您的一些数据在资源中被JSON序列化,而一些数据通过URL参数发送?可能示例代码表示得不好,但在该示例中,您发送了一个
PUT
请求,响应主体为
{“id”:123}
,url为
/comments/123
。这不是多余的吗?为什么不将JSON字符串中的
内容
属性和数据发送到服务器?然后它实际上会有您正在寻找的
null
值,因为JSON字符串可以表示
null
类型值。另外,如果要删除/销毁记录,为什么不使用
DELETE
请求,而是将销毁方法与PUT请求混在一起

那么为什么不做这样的事情呢?我不确定
用户
与此有什么关系

var Comment = $resource('/comments/:id', {id: @id}, {
  destroy: {method: 'PUT'}
});
new Comment({id: 123, content: null}).$destroy();

自从我提出问题以来所做的评论意味着不应该发送
null
,因为它不能正确地封装在HTTP参数中。但是,它可以封装在JSON中。为什么有人要发送空值?因为将null发送到一个
upsert
[1]端点意味着销毁。不幸的是,无法在
.destroy()
调用中将
内容的默认值定义为null

我接受的答案是:

var Comment = $resource('/comments/:id', {id:'@id'}, {
  destroy: { method: 'PUT' }
});
var comment = Comment.destroy({id:123, content: null});
这与@jbielick的答案完全相同,他很好地解释了为什么它不能作为默认参数工作,但如果它作为输入对象的一部分提供给JSONify,它就可以工作

  • Upsert是单词insert和update的合并

  • 你为什么要发送null?所有参数值都以字符串形式发送,因此Angular无论如何都无法发送。我之所以发送null,是因为我的API有一个upsert端点,所以发送content:null应该会破坏它。在权衡方面有各种原因,这意味着upsert提供了一个更干净的API,而不是
    DESTROY
    请求。