ajax POST n’envoie pas de partie d’object

J’ai donc ce code:

var ajaxUrl = 'a/7776/as'; var data = { 'answer' : { 'user_input' : [] }, 'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' } $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, success: function(json){ } }); 

Cependant, lorsque j’ai inspecté la source POST, il semble que la réponse ne soit pas envoyée.

Voici la source POST dans Firebug:

 Parametersapplication/x-www-form-urlencoded form_build_id form-ffe6f10e9601470ed4cfe38257a959a6 Source form_build_id=form-ffe6f10e9601470ed4cfe38257a959a6 

Pourquoi est-ce le cas et comment puis-je le faire envoyer également la partie “réponse” de l’object dans la publication AJAX?

Belle explication de TJ Crowder, clairement informé. Voici ma réponse à une réponse pratique. J’ai inspecté mon trafic HTTP et exécuté votre requête AJAX ci-dessus. Comme prévu, la answer n’a pas été envoyée. En allant également avec la réponse de l’adrénaline ci-dessus, si vous recherchez “ajax n’envoyant pas de tableau vide” sur Google, vous pouvez voir, par le nombre de résultats liés, qu’il s’agit également d’un problème. Ce que je ferais, si user_input est un tableau vide, envoyez null place. Je l’ai essayé moi-même pour m’assurer et, toujours comme prévu, j’ai observé cette fois le paramètre answer envoyé dans la requête, ainsi que user_input qui avait été envoyé avec la valeur null avec le code ci-dessous.

 var userInput = []; //not sure where this is coming from in reality, but this is just an example. if (userInput.length == 0){ //in this example, this is obviously always true userInput = null; } var ajaxUrl = 'a/7776/as'; var data = { 'answer' : { 'user_input' : userInput }, 'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6' } $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, success: function(json){ } }); 

Le codage POST par défaut est multipart/form-data , qui consiste en une série plate de paires name=value .

Votre structure ne peut pas être mappée directement sur une série plate de paires name=value , car elle est complexe. Vous avez un membre qui est un object, qui a une propriété faisant référence à un tableau.

Si vous souhaitez envoyer une structure arbitrairement complexe, vous devez utiliser un codage différent et vous assurer que le serveur comprend ce codage. Par exemple, vous pouvez envoyer du JSON ou du XML au serveur, mais vous devez le préciser, en définissant la propriété contentType sur la méthode ajax (qui définit le type des données que vous envoyez au serveur). . Ensuite, votre serveur doit comprendre comment désérialiser ce fichier JSON ou XML.

Sinon, assurez-vous que votre structure peut être mappée à une série plate de paires name=value .

Un centre de transition consiste à envoyer des données multipart/form-data , mais vous envoyez une seule paire name=value et indiquez que la partie value est un codage différent, comme celui-ci:

 $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: {json: JSON.ssortingngify(data)}, success: function(json){ } }); 

Cela envoie une paire name=value unique avec le nom json , où la valeur est une chaîne codée par JSON. Votre serveur récupérera la valeur du paramètre json normalement, puis utilisera un désérialiseur JSON pour recréer le graphe d’object.

Cette technique à mi-chemin est parfois utile dans les frameworks rendant difficile l’utilisation de quelque chose d’autre que le codage de requête standard.

Parce que vous ne pouvez pas publier un tableau de longueur zéro. Les clés POST (ou de requête HTTP) ne contiennent aucune information de type et un tableau de longueur nulle constituerait effectivement une valeur null dans un corps de POST: message = [] sera sérialisé en ”.

Vous devez définir la valeur traditional à true si vous souhaitez que la charge contienne un tableau.

 $.ajax({ url: ajaxUrl, dataType: 'json', type: 'POST', data: data, traditional: true, success: function (json) {} });