Enviar null como valor en ngResource AngularJS

Estoy usando ngResource de AngularJS 1.2.1 y estoy tratando de enviar null como un valor en los parameters en una request PUT. Desafortunadamente, cuando se establece, Angular lo ignorará y no lo enviará.

Aquí hay un código de ejemplo:

 var User = $resource('/comments/:id', {id:'@id'}, { destroy: { method: 'PUT', params: {content: null} } }); var user = User.destroy({id:123}, function() {}); 

En cambio, Angular ignorará el content y no enviará la key ni el valor nulo.

¿Cómo puedo hacer que Angular envíe nulo?

Como ha señalado Lèse, el tipo javascript null no es un valor válido para un parámetro de URL.

Un valor null JavaScript no es lo mismo que la cadena 'null' . Entonces, si desea que su URL se parezca a /comments/123?content=null solo proporcione una cadena 'null' . Los parameters de URL no son JSON y un valor null en javascript no significa lo mismo que content=null porque en este último caso, cualquier server dado interpretaría nulo como un valor de cadena.

El service $ http de Angular filtra valores nulos e indefinidos en el object params antes de build una url con ellos porque no hay una forma estandarizada de enviar undefined como un "valor" a un server. Simplemente no tiene sentido. Sin embargo, si desea enviar una cadena como 'undefined' o 'null' está bien, pero requiere la implementación en el lado del server para interpretarlo como tal.

Si está realizando una request PUT , ¿por qué algunos de sus datos están serializados por JSON dentro del recurso y algunos de ellos se envían a través de un parámetro de URL? Tal vez el código de ejemplo está apenas representado, pero en ese ejemplo está enviando una request PUT con el cuerpo de respuesta de {"id": 123} y la url /comments/123 . ¿No es eso networkingundante? ¿Por qué no está enviando la propiedad y los datos de content en la cadena JSON al server? Entonces realmente tendría el valor null que está buscando porque las cadenas JSON pueden representar un null tipo null . Además, si está eliminando / destruyendo un logging, ¿por qué no utiliza una request DELETE , sino que alias un método de destrucción con una request PUT?

Entonces, ¿por qué no algo como esto? No estoy seguro de qué tiene que ver el User con eso …

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

Los comentarios que se han realizado desde mi pregunta significan que null no se debe enviar, ya que no se puede encapsular correctamente en parameters HTTP. Sin embargo, puede ser encapsulado en JSON. ¿Por qué alguien querría enviar un valor nulo? Debido a que enviar nulo a un punto final de upsert [1] significa destroy. Desafortunadamente, no hay forma de definir que el content pnetworkingeterminado sea nulo en la llamada .destroy() .

La respuesta con la que me conformé fue:

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

Esto es exactamente como la respuesta de @ jbielick y hace un buen trabajo explicando la razón por la cual no funcionó como un parámetro pnetworkingeterminado, pero funciona si se proporcionó como parte del object de input a JSONify.

  1. Upsert es una fusión de las palabras insert y actualizar.