11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous

J'ai actuellement un script JS qui appelle des fonctions du serveur en AJAX en passant des paramètres au serveur sous la forme url?action=xxx&param1=yyy&param2=zzz qui retourne une structure de données en XML.

J'aimerais pouvoir réduire le nombre d'appels en exécutant plusieurs actions sur le serveur et en récupérant une structure XML qui donne les résultats composés de ces actions.
Pas difficile de composer une structure complexe xml en réponse, mais je me demande quelle est la meilleure façon de passer une structure un peu complexe dans la requête ?

Je pense que je pourrais mettre cette structure en JSON, mais sous quelle forme la passer au serveur?
Je n'ai pas compris grand chose aux tutoriels que j'ai pu trouver, la plupart masquant à la fois la façon de passer les données en utilisant jQuery (ce que je ne tiens pas à faire) et surtout la façon d'analyser la requête sur le serveur.

Merci d'éclairer ma lanterne.
Salut,

Perso je ne passe que pas du POST pour passer mes big tableaux. ce sont simplement des arrays que je convertie en json à l'arrivée.
Moi aussi je passe par du post, c'était juste pour que ça soit plus simple à montrer sous la forme d'un get, mais le résultat est le même.
Si je mets une action avec 2 ou plus paramètres, je peux mettre
action=xxx, param1=yyy, param2=zzz
ou bien
action=xxx, param[]=yyy, param[]=zzz

Mais si ça devient plus complexe, même simplement deux actions, il faut une structure un peu plus tordue, je cherche à ne pas réinventer la roue, je suppose qu'il doit y avoir de "bonnes pratiques" à ce sujet.
Modifié par PapyJP (23 Feb 2018 - 16:20)
Ok, que ce soit du json, xml, fichier, image, command, text, array, etc... je passe tout par du post...

Je ne comprend pas ce que tu cherche, je vais laisser les autres te répondre.
Salut JP Smiley cligne

Un peu comme Jencal n'ayant pas compris le problème je n'ai pas voulu répondre...
Je ne comprend toujours pas Smiley decu

tu veux pas nous faire un exemple ??
tu as quoi actuellement et tu voudrais faire quoi ??
le post (ou le get) te permet de passer un peu tout ce que tu veux...
Donc là je vois pas non plus...
Modérateur
Je tente ma chance !

Je crois que JP veut envoyer une array de param plutôt que de tout passer en argument d'url.
Je ne sais pas si c'est possible avec seulement du Js/AJAX et du PHP....

Si c'est pour clarifier ton code d'envoi rien ne t’empêche de faire une array et de faire une boucle qui linéarise tout dans l'url juste avant l'envoi.

Si c'est pour "réduire le nombre d'appels en exécutant plusieurs actions sur le serveur et en récupérant une structure XML qui donne les résultats composés de ces actions." et bien il te suffit de tout envoyer a un fichier PHP qui lui va re-répartir coté serveur et ne te renvoyer qu'un seul résultats.
Modifié par _laurent (23 Feb 2018 - 17:01)
Désolé d'être confus.
Le programme sur lequel je travaille en ce moment est un outil de gestion des fichiers et sous-répertoires d'un répertoire du site.
Pour ça, j'ai défini un objet JS sous la forme suivante:

function AJAXFormObject(actionFile, data, whenDone, args) {
    this.actionFile = actionFile;   //le script PHP qui gère ce bazar sur le serveur
    this.data = data;  //les données à passer à ce script PHP
    this.whenDone = whenDone; //le script à appeler quand on a reçu la réponse en XML
   this.args = [].concat(args); //les arguments à passer au programme "whenDone" en plus de la réponse XML reçue du script PHP
    this.submit = function() {
        //cette fonction fabrique un objet formData et l'utilise pour construire la requête
    }
    var xhr = new XMLHttpRequest();
    xhr.AJAXForm = this; // permet de retrouver l'environnement dans la fonction "onreadychange"
   xhr.onreadystatechange = function() {
        //le code qui reçoit la réponse et déclenche "whenDone"
    }
   xhr.open('post', this.actionFile); 
   xhr.send(this.formData); //déclenche le script PHP
}


Avec cet outil, je parviens à gérer facilement les actions que je veux effectuer sur le site, mais ces actions sont très simples, genre "renomme un fichier" ou "donne moi le contenu d'un répertoire".
Pour le premier, je donne comme paramètre data {action:"rename", path:dirpath/oldname, newname:newname}
Pour le deuxième je donne {action:"filelist", path:dirpath}
Le programme "submit" fabrique une structure de requête simple à partir de cet objet "data", ce qui vu du serveur se traduit par $_POST['action'] etc.
Par contre si je veux pouvoir dire "renomme un fichier et donne moi le contenu d'un répertoire après renommage" en une seule opération, je dois passer les deux séries de paramètres en une fois. Et bien sûr si je veux faire plusieurs actions en une fois, ça se complique davantage.

Ma question est "dans ce genre de cas, quelle vous semble être la meilleure façon d'opérer?"
Modifié par PapyJP (23 Feb 2018 - 17:48)
Modérateur
Alors voici un exemple pour envoyer du JSON (c'est adaptable pour ce que tu veux passer au final, XML, YAML, etc.).

en javascript


var mesdonnees= {
 bar: foo,
 cup: [5, 78, 63]
 lemon: {type: fruit, age: 64}
};

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://www.example.com/truc/bidule');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
    if (xhr.status === 200) {
        console.log(xhr.responseText);
    }
    else {
      console.error('kaputt');
   }
};
xhr.send(JSON.stringify(mesdonnees));

et récupération en php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

  $inputJSON = file_get_contents('php://input');
  $input = json_decode($inputJSON);
}

Modifié par kustolovic (23 Feb 2018 - 17:51)
Meilleure solution
Merci kusto, c'est ce genre de chose que je cherchais.
Je ne savais pas comment d'une part passer un paramètre JSON et d'autre part comment le récupérer côté serveur.
Jamais vu
$inputJSON = file_get_contents('php://input');
auparavant!
Modifié par PapyJP (23 Feb 2018 - 18:06)