jQuery publiant un json valide dans le corps de la requête

180

Donc, selon la documentation jQuery Ajax , il sérialise les données sous la forme d'une chaîne de requête lors de l'envoi de requêtes, mais le réglage processData:falsedevrait me permettre d'envoyer du JSON réel dans le corps. Malheureusement, j'ai du mal à déterminer d'abord si cela se produit et ensuite à 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 le client http pour publier un objet littéral {someKey:'someData'}, cela fonctionne. Mais lors de l'utilisation de jQuery avec data: {someKey:'someData'}, cela échoue. Malheureusement, lorsque j'analyse la demande dans Safari, cela dit que la charge utile du message est [object Object]... géniale ... et dans Firefox, le message est vide ...

Lors de la journalisation du contenu du corps du côté Java, il obtient littéralement [object Object]alors comment envoyer de VRAIES données JSON?

Quelqu'un a-t-il eu de l'expérience avec un service Java sérialisant des données JSON dans le corps de la requête, avec la requête envoyée depuis 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'
});
Brad
la source

Réponses:

293

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 n'ont pas l' JSONobjet, utilisez json2.js qui l'ajoutera.


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

Nick Craver
la source
alors je n'ai plus besoin de processData: false en utilisant JSON.stringify()?
brad
6
@brad - correct, cela n'a pas d'importance après avoir fait cela car c'est déjà une chaîne, et dans ce cas, jQuery ne la traitera pas davantage .
Nick Craver
2
a fonctionné comme un charme, merci beaucoup! Est-il vrai alors que tous les corps de requête doivent être des chaînes qui sont analysées à l'autre extrémité?
brad
Pourquoi jQuery analyse-t-il le datadans une chaîne, au lieu de simplement l'envoyer au format JSON?
Adam Zerner
Note latérale: si quelqu'un en a besoin en tant que "charge utile de demande de corps" au lieu de données de formulaire, n'oubliez pas d'inclure contentType: "application/json; charset=utf-8",comme mentionné dans ce fil: stackoverflow.com/questions/21201270/…
raydlevel5