在ngResource AngularJS中将null作为值发送

时间:2014-03-11 02:10:17

标签: 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}, function() {});

Angular将忽略content而不发送密钥或空值。

如何让Angular发送null?

2 个答案:

答案 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的输入对象的一部分提供的话。

  1. Upsert是单词insert和update的合并。