12 votes

jQuery : Comment empêcher la fonction AJAX d'échapper la chaîne JSON utilisée pour le POST de données

J'ai besoin de sérialiser toutes les entrées d'un formulaire dans une chaîne JSON.
Avec l'aide de ce poste Je peux créer avec succès une chaîne valide comme ci-dessous :

{"input01":"value01","input02":"value02","input03":"value03"}

Cependant, lorsque j'essaie d'utiliser la chaîne pour envoyer des données par POST à l'aide de la fonction Ajax de jQuery, celle-ci semble ajouter des antislashes à la chaîne, ce qui fait que la chaîne JSON est envoyée par GET plutôt que par POST. La page PHP chargée renvoie un $_GET réseau de :

[{\"input01\":\"value01\",\"input02\":\"value02\",\"input03\":\"value03\"}] =>

J'ai testé la chaîne JSON en utilisant alert() pour confirmer que la structure est correcte avant d'être utilisée dans la fonction AJAX.
De plus, si je saisis manuellement la chaîne JSON valide, l'AJAX affiche les données correctement.

Mon code est le suivant :

var dataJSON = $.toJSON($('#form').serializeObject());
alert(dataJSON);

$.ajax({
    type: "POST",
    url: "ajax.php",
    data: 'Query01=01&Query02=02',
    dataType: 'json',
    success: function(data){
       if (data==1){
         $('#wrap').load('ajax.php',dataJSON);
       }
    }
});

11voto

cletus Points 276888

C'est le comportement par défaut de $.ajax() . Vous pouvez le modifier en réglant le processData option pour false . Voir $.ajax() options .

data  Object, String

Données à envoyer au serveur. Elles sont converties en chaîne de requête, si ce n'est déjà une chaîne. Elle est ajoutée à l url pour les requêtes GET. Voir l'option processData pour empêcher ce traitement automatique. automatique. Les objets doivent être des paires Clé/Valeur paires. Si la valeur est un tableau, jQuery sérialise plusieurs valeurs avec la même même clé, c'est-à-dire que {foo :["bar1", "bar2"]} devient '&foo=bar1&foo=bar2'.

y

processData   Boolean Default: true

Par défaut, les données transmises à la fonction data sous la forme d'un objet (techniquement tout ce qui n'est pas une chaîne) seront traitées et transformées en une chaîne de qui correspond à l'option par défaut content-type "application/x-www-form-urlencoded". Si vous souhaitez envoyer des DOMDocuments, ou d'autres données non traitées, mettez cette cette option à false.

3voto

Je l'ai fait pour qu'il fonctionne avec stripslashes du côté de php.

Quelque chose comme ça :

$data = json_decode(stripslashes($_POST['json_data']));

2voto

Michał W Points 13

Assurez-vous que vous

echo $_GET['varwithurl']

no

echo json_encode($_GET['varwithurl'])

comme le font de nombreux exemples de sites Web en php.

J'envoie les données avec l'url avec $.ajax() et ne pas voir les backslashes non désirés dans le php script.

0voto

ticallian Points 540

Après avoir parcouru Google et le site de jQuery, j'en suis venu à la conclusion personnelle que le $.load convertira toute variable qui lui est passée en chaîne de recherche (comme le soulignait mon problème initial ci-dessus). Si vous souhaitez passer une chaîne JSON à travers elle, elle doit être tapée manuellement.

Pour contourner ce problème, j'ai utilisé l'option de bas niveau $.ajax à la place. L'avantage d'utiliser cette méthode est que je pouvais également envoyer des données POST en utilisant la fonction standard .serialize() plutôt que de devoir convertir les données de mon formulaire en JSON.

Mon code final :

var formData = $('#form').serialize();

$.ajax({
     type: "POST",
     url: "ajax.php",
     data: 'Query01=01&Query02=02',
     dataType: 'json',
     success: function(data){
          if (data==1){
               $.ajax({
                    type: "POST",
                    url: "ajax.php",
                    data: formData,
                    success: function(html){
                         $("#wrap").replaceWith(html);
                    }   
               });
          }
     }
});

Si quelqu'un d'autre a une solution, veuillez commenter.

-2voto

Nipa Points 7
<html>
<head>
<script src="resources/jquery-2.1.0.js"></script>
<script src="resources/jquery.serializejson.min.js"></script>
</head>
<body>
  <script>

        $(document).ready(function(){

            $("#simplepost").click(function(e){

                var MyForm = $("#appForm").serializeJSON();
                console.log(MyForm);

            $.ajax(
                    {
                        url: "rest/emp/create",
                        type: "POST",
                        data: JSON.stringify(MyForm),
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success:function(maindta){
                            alert(maindta);
                        },
                        error: function(jqXHR, testStatus, errorThrown){
                            alert(errorThrown);
                        }
                    });
            e.preventDefault(); //STOP default action
        });
    });
</script>
<h2>Hello World!</h2>
<form id="appForm" method="POST">
    EmployeeID:<input type="text" name='id' value="" />
    Employee Name:<input type="text" name="name" value=""/>
<br>
<input type="button" value="Submit" id="simplepost" />
</form>
</body>
</html>

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