9

我正在使用 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?

4

2 回答 2

4

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

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

Angular 的 $http 服务在使用它们构建 url 之前过滤掉 params 对象中的空值和未定义值,因为没有标准化的方式将undefined“值”作为“值”发送到服务器。这没有任何意义。但是,如果您想发送一个类似的字符串,'undefined'或者'null'这很好,但它需要在服务器端实现才能将其解释为这样。

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

那么为什么不这样呢?我不确定这User与它有什么关系......

var Comment = $resource('/comments/:id', {id: @id}, {
  destroy: {method: 'PUT'}
});
new Comment({id: 123, content: null}).$destroy();
于 2014-08-10T15:34:45.863 回答
0

自我的问题以来所做的评论意味着null不应发送,因为它无法正确封装在 HTTP 参数中。但是,它可以封装在 JSON 中。为什么有人要发送空值?因为将 null 发送到upsert[1] 端点意味着销毁。不幸的是,没有办法在调用中将默认值定义content为 null 。.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 的合并。
于 2014-08-11T05:11:57.333 回答