183 votes

Comment envoyer du JSON au lieu d'une chaîne de requête avec $.ajax ?

Quelqu'un peut-il expliquer de manière simple comment faire en sorte que jQuery envoie du JSON au lieu d'une chaîne de requête ?

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});

Cela convertira en fait votre JSON soigneusement préparé en une chaîne de requête. L'une des choses les plus ennuyeuses est que tout array: [] dans votre objet sera converti en array[]: [] probablement en raison des limites de l'enquête.

7 votes

En dataType n'a aucune incidence sur la manière dont les données sont envoyées. Il spécifie simplement le type de données que vous attendez. retourné par l'appel. Si vous souhaitez indiquer au serveur le type de données que vous spécifiez dans l'élément data vous devez définir la propriété contentType propriété similaire à contentType: "application/json"

0 votes

Merci de cette précision. Mais dans ce cas, pourquoi dois-je spécifier le type de réponse côté client si le serveur fournit un en-tête content-type dans la réponse ?

2 votes

Vous n'avez pas avoir pour le spécifier, jQuery essaiera par défaut de faire une supposition intelligente basée sur le type MIME de la réponse. Cependant, en le spécifiant, vous indiquez explicitement à jQuery le type que vous attendez du serveur et jQuery tentera de convertir la réponse en un objet de ce type. Si vous ne le précisez pas et que vous laissez jQuery deviner, jQuery risque de convertir la réponse dans un format inattendu, même si vous avez envoyé du JSON depuis le serveur. Consultez la documentation pour plus de détails sur le type de données (dataType) : api.jquery.com/jQuery.ajax

270voto

Marcus Ekwall Points 14489

Vous devez utiliser JSON.stringify pour sérialiser d'abord votre objet en JSON, puis pour spécifier l'attribut contentType pour que votre serveur comprenne qu'il s'agit de JSON. Ceci devrait faire l'affaire :

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

Il convient de noter que le JSON est nativement disponible dans les navigateurs qui prennent en charge JavaScript 1.7 / ECMAScript 5 ou une version ultérieure. Si vous avez besoin d'un support ancien, vous pouvez utiliser json2 .

14 votes

Cela ne fonctionnera pas, il manque contentType: 'application/json' .

0 votes

@Ohgodwhy Oh oui. C'est allé un peu trop vite ;)

1 votes

Merci. Je pensais que dataType s'occupait de cela, mais je me suis trompé. Je pense que vous pourriez spécifier charset dans le content-type comme Bergi l'a fait dans l'autre réponse.

31voto

Bergi Points 104242

No, el dataType option sert à analyser les données reçues.

Pour poster du JSON, vous devrez le filtrer vous-même via la fonction JSON.stringify et définir le processData à l'option false .

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

Notez que tous les navigateurs ne prennent pas en charge l'option JSON et bien que jQuery dispose de l'objet .parseJSON Il n'y a pas de stringifier dans cette bibliothèque ; vous aurez besoin d'une autre bibliothèque polyfill.

4 votes

Paramètres processData a false n'est pas nécessaire puisque JSON.stringify renvoie déjà une chaîne de caractères.

0 votes

@MarcusEkwall : A priori, ce serait toujours le cas encodeURIComponent n'est-ce pas ?

0 votes

D'accord, ce n'est peut-être pas nécessaire, mais pensez-vous vraiment que cela ferait échouer la demande ?

5voto

yardpenalty Points 90

Bien que je sache que de nombreuses architectures comme ASP.NET MVC ont une fonctionnalité intégrée pour gérer JSON.stringify en tant que contentType, ma situation est un peu différente et peut-être que cela pourrait aider quelqu'un à l'avenir. Je sais que cela m'aurait permis d'économiser des heures !

Comme mes requêtes http sont gérées par une API CGI d'IBM (environnement AS400) sur un sous-domaine différent, ces requêtes sont cross origin, d'où le jsonp. J'envoie en fait mon ajax via un (des) objet(s) javascript. Voici un exemple de mon POST ajax :

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });

1voto

Tod Points 108

Si vous renvoyez cela à asp.net et que vous avez besoin des données dans request.form[], vous devez définir le type de contenu à "application/x-www-form-urlencoded ; charset=utf-8"

Message original aquí

Deuxièmement, débarrassez-vous du type de données, si vous n'attendez pas de retour, le POST attendra environ 4 minutes avant d'échouer. Voir aquí

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