Envoyer null comme valeur dans ngResource AngularJS

J'utilise NgResource de AngularJS 1.2.1 et j'essaie d'envoyer une valeur null dans les paramètres dans une requête PUT. Malheureusement, quand il est réglé, Angular va ignorer le paramètre et ne pas l'envoyer.

Voici un exemple de code:

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

Angular va plutôt ignorer le content et ne pas envoyer la clé ni la valeur nulle.

Comment puis-je rendre nulle l'envoi angulaire?

Comme l'a souligné Lèse, le type javascript null n'est pas une valeur valide pour un paramètre URL.

Une valeur null javascript n'est pas la même que la chaîne 'null' . Donc, si vous vouliez que votre URL se ressemble /comments/123?content=null suffit de fournir une chaîne 'null' . Les paramètres d'URL ne sont pas JSON et une valeur null dans javascript ne signifie pas la même chose que content=null car dans ce dernier cas, null serait interprété par n'importe quel serveur donné comme une valeur de chaîne.

Le service $ http de Angular filtre les valeurs nulles et non définies dans l'objet Params avant de construire une url avec eux car il n'y a pas de moyen normalisé d'envoyer undefined comme une "valeur" à un serveur. Cela n'a tout simplement pas de sens. Cependant, si vous vouliez envoyer une chaîne comme 'undefined' ou 'null' , cela nécessite une mise en œuvre sur le côté serveur pour l'interpréter comme tel.

Si vous faites une requête PUT , pourquoi certaines de vos données sont-elles en série JSON dans la ressource et certaines d'entre elles sont envoyées via un paramètre URL? Peut-être que le code d'exemple est simplement peu représenté, mais dans cet exemple, vous envoyez une requête PUT avec le corps de réponse de {"id": 123} et l'URL /comments/123 . N'est-ce pas si redondant? Pourquoi n'êtes-vous pas envoyer la propriété de content et les données dans la chaîne JSON au serveur? Ensuite, il aurait la valeur null que vous recherchez car les chaînes JSON peuvent représenter une valeur de type null . En outre, si vous supprimez / détruisez un enregistrement, pourquoi n'utilisez-vous pas une requête DELETE , mais utilisez-vous une méthode de destruction avec une requête PUT?

Alors, pourquoi pas quelque chose comme ça? Je ne suis pas sûr de ce que l' User a à faire avec …

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

Les commentaires qui ont été effectués depuis ma question signifient que null ne doit pas être envoyé car il ne peut pas être correctement encapsulé dans les paramètres HTTP. Cependant, il peut être encapsulé dans JSON. Pourquoi quelqu'un voudrait-il envoyer une valeur nulle? Parce que l'envoi nulle à un point upsert [1] signifie détruire. Malheureusement, il n'y a aucun moyen de définir la valeur par défaut du content nul dans l'appel .destroy() .

La réponse avec laquelle j'ai réglé était:

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

C'est exactement pareil à la réponse de @ybielick et il fait un bon travail expliquant pourquoi il ne fonctionnait pas comme un paramètre par défaut, mais fonctionne si elle était fournie dans le cadre de l'objet d'entrée à JSONify.

  1. Upsert est une fusion des mots insérer et mettre à jour.