204 votes

jQuery affiche du json valide dans le corps de la requête

Ainsi, selon le Documents sur jQuery Ajax il sérialise les données sous la forme d'une chaîne de requête lors de l'envoi des demandes, mais la définition de l'option processData:false devrait me permettre d'envoyer du JSON dans le corps. Malheureusement, j'ai du mal à déterminer, premièrement, si cela se produit et, deuxièmement, à quoi ressemble l'objet qui est envoyé au serveur. Tout ce que je sais, c'est que le serveur n'analyse pas ce que j'envoie.

Lorsque vous utilisez client http pour afficher un objet littéral {someKey:'someData'} cela fonctionne. Mais lorsque vous utilisez jQuery avec data: {someKey:'someData'} il échoue. Malheureusement, lorsque j'analyse la demande dans Safari, il est indiqué que la charge utile du message est la suivante [object Object] ... super... et dans Firefox le message est vide...

Lorsque l'on enregistre le contenu du corps du texte du côté Java, on obtient littéralement [object Object] alors comment envoyer de VRAIES données JSON ?

Quelqu'un a-t-il fait l'expérience d'un service Java sérialisant des données JSON dans le corps de la requête, la requête étant envoyée par jQuery ?

BTW voici la requête $.ajax complète :

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});

328voto

Nick Craver Points 313913

Une requête JSON réelle ressemblerait à ceci :

data: '{"command":"on"}',

où vous envoyez une chaîne JSON réelle. Pour une solution plus générale, utilisez JSON.stringify() pour sérialiser un objet en JSON, comme ceci :

data: JSON.stringify({ "command": "on" }),

Pour prendre en charge les navigateurs plus anciens qui ne disposent pas de l'option JSON utilisez json2.js qui l'ajoutera.


Ce qui se passe actuellement est que depuis que vous avez processData: false il s'agit essentiellement d'envoyer ceci : ({"command":"on"}).toString() qui est [object Object] ...ce que vous voyez dans votre demande.

0 votes

Donc je n'ai plus besoin du processData : false en utilisant JSON.stringify() ?

6 votes

@brad - correct, cela n'aura pas d'importance après avoir fait cela parce que c'est déjà une chaîne de caractères, et dans ce cas jQuery ne le traitera pas davantage. .

2 votes

A fonctionné comme un charme, merci beaucoup ! Est-il vrai que tous les corps de requêtes doivent être des chaînes de caractères qui sont analysées par l'autre partie ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X