162 votes

Javascript : Envoyer un objet JSON avec Ajax ?

Est-ce possible ?

xmlHttp.send({
    "test" : "1",
    "test2" : "2",
});

Peut-être avec : un en-tête avec content type : application/json ? :

xmlHttp.setRequestHeader('Content-Type', 'application/json')

Sinon, je peux utiliser :

xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

et ensuite JSON.stringify l'objet JSON et l'envoyer dans un paramètre, mais ce serait cool de l'envoyer de cette façon si c'est possible.

351voto

Nathan Romano Points 2024

Avec jQuery :

$.post("test.php", { json_string:JSON.stringify({name:"John", time:"2pm"}) });

Sans jQuery :

var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
xmlhttp.open("POST", "/json-handler");
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify({name:"John Rambo", time:"2pm"}));

2 votes

Mais je peux utiliser content-type : application/x-www-form-urlencoded aussi si j'utilise stringify, alors quel est l'intérêt d'utiliser application/json ? :)

4 votes

@CIRK : Quelle importance ? Le paramètre content-type est complètement arbitraire à moins que le serveur ne traite l'un ou l'autre spécialement. Ce sont juste des données qui circulent dans les deux sens à la fin de la journée.

19 votes

Si le corps de votre message doit être JSON, par exemple ({nom : "John",time : "2pm"}), utilisez le type de contenu application/json si le corps de votre message est constitué de données urlencodées (name=John&time=2pm), utilisez le type de contenu application/x-www-form-urlencoded.

39voto

shantanu chandra Points 539

Si vous n'utilisez pas jQuery, veuillez vous en assurer :

var json_upload = "json_name=" + JSON.stringify({name:"John Rambo", time:"2pm"});
var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
xmlhttp.open("POST", "/file.php");
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(json_upload);

Et pour la partie réceptrice de php :

 $_POST['json_name']

0 votes

Vous ne pouvez pas l'utiliser directement ?

8 votes

Je ne pense pas que cela réponde à la question posée. Je pense que le développeur veut envoyer un blob de JSON à PHP en tant que Content-Type : application/json, non enveloppé dans un wrapper urlencodé.

2 votes

Ce n'est pas vraiment l'envoi de JSON, c'est l'envoi de formdata. Vous pouvez également envoyer JSON directement, auquel cas vous ne pouvez pas le lire avec $_POST, mais plutôt avec json_decode(file_get_contents('php://input')) ;

2voto

Dave Points 21

J'ai lutté pendant quelques jours pour trouver quelque chose qui fonctionne pour moi, car il fallait passer plusieurs tableaux d'identifiants et renvoyer un blob. Il s'avère que si vous utilisez .NET CORE, j'utilise la version 2.1, vous devez utiliser [FromBody] et comme vous ne pouvez l'utiliser qu'une seule fois, vous devez créer un modèle de vue pour contenir les données.

Rédigez le contenu comme ci-dessous,

var params = {
            "IDs": IDs,
            "ID2s": IDs2,
            "id": 1
        };

Dans mon cas, j'avais déjà jsoné les tableaux et passé le résultat à la fonction.

var IDs = JsonConvert.SerializeObject(Model.Select(s => s.ID).ToArray());

Ensuite, appelez le XMLHttpRequest POST et stringifiez l'objet

var ajax = new XMLHttpRequest();
ajax.open("POST", '@Url.Action("MyAction", "MyController")', true);
ajax.responseType = "blob";
ajax.setRequestHeader("Content-Type", "application/json;charset=UTF-8");           
ajax.onreadystatechange = function () {
    if (this.readyState == 4) {
       var blob = new Blob([this.response], { type: "application/octet-stream" });
       saveAs(blob, "filename.zip");
    }
};

ajax.send(JSON.stringify(params));

Alors ayez un modèle comme celui-ci

public class MyModel
{
    public int[] IDs { get; set; }
    public int[] ID2s { get; set; }
    public int id { get; set; }
}

Ensuite, passez dans l'action comme

public async Task<IActionResult> MyAction([FromBody] MyModel model)

Utilisez ce module complémentaire si vous renvoyez un fichier

<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>

1voto

user3310115 Points 309

Ajout de Json.stringfy autour du json qui a corrigé le problème

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