1673 votes

Requête post JavaScript comme une soumission de formulaire

Je cherche à rediriger un navigateur vers une autre page. Si je voulais une requête GET, je pourrais dire

document.location.href = 'http://example.com/q=a';

Mais la ressource que j'essaie d'accéder ne répondra pas correctement à moins que j'utilise une requête POST. Si cela n'était pas généré dynamiquement, je pourrais utiliser le HTML

Ensuite, je soumettrais simplement le formulaire depuis le DOM.

Mais vraiment, j'aimerais un code JavaScript qui me permet de dire

post_to_url('http://example.com/', {'q':'a'});

Quelle est la meilleure implémentation cross-browser ?

J'ai besoin d'une solution qui change l'emplacement du navigateur, tout comme soumettre un formulaire. Si c'est possible avec XMLHttpRequest, ce n'est pas évident. Et cela ne doit pas être asynchrone, ni utiliser XML, donc Ajax n'est pas la réponse.

2 votes

Comme mentionné dans un autre fil de discussion, il existe un plugin jquery ".redirect" qui fonctionne avec la méthode POST ou GET. Il crée un formulaire avec des saisies cachées et le soumet pour vous. Ex: $.redirect('demo.php', {'arg1': 'valeur1', 'arg2': 'valeur2'}); github.com/mgalante/jquery.redirect/blob/master/…

0 votes

L'objet document n'a pas de location.href vous avez besoin d'utiliser window.

2287voto

Rakesh Pai Points 9905

Créer dynamiquement des dans un formulaire et le soumettre

/**
 * envoie une requête à l'URL spécifiée à partir d'un formulaire. Cela changera la localisation de la fenêtre.
 * @param {string} path le chemin pour envoyer la requête post
 * @param {object} params les paramètres à ajouter à l'URL
 * @param {string} [method=post] la méthode à utiliser sur le formulaire
 */

function post(path, params, method='post') {

  // Le reste de ce code suppose que vous n'utilisez pas de bibliothèque.
  // Il peut être moins verbeux si vous en utilisez une.
  const form = document.createElement('form');
  form.method = method;
  form.action = path;

  for (const key in params) {
    if (params.hasOwnProperty(key)) {
      const hiddenField = document.createElement('input');
      hiddenField.type = 'hidden';
      hiddenField.name = key;
      hiddenField.value = params[key];

      form.appendChild(hiddenField);
    }
  }

  document.body.appendChild(form);
  form.submit();
}

Exemple:

post('/contact/', {name: 'Johnny Bravo'});

EDITION: Comme cela a été beaucoup voté, je suppose que les gens vont copier-coller cela beaucoup. J'ai donc ajouté la vérification de hasOwnProperty pour corriger d'éventuels bugs involontaires.

11 votes

Que dire des tableaux dans les paramètres de données ? Jquery post() interprète par exemple : "data: {array: [1, 2, 3]}" comme ?array=1&array=2&array=3. Ce code donne un autre résultat.

24 votes

Avertissement : Malgré les nombreux votes positifs, cette solution est limitée et ne gère pas les tableaux ou les objets imbriqués à l'intérieur d'un formulaire. Sinon, c'est une excellente réponse.

1 votes

J'ai créé un gist avec le code gist.github.com/lingceng/175f493450636e505cc3

140voto

Ryan Delucchi Points 3323

Ce serait une version de la réponse sélectionnée utilisant jQuery.

// Poster vers l'URL fournie avec les paramètres spécifiés.
function post(path, parameters) {
    var form = $('');

    form.attr("method", "post");
    form.attr("action", path);

    $.each(parameters, function(key, value) {
        var field = $('');

        field.attr("type", "hidden");
        field.attr("name", key);
        field.attr("value", value);

        form.append(field);
    });

    // Le formulaire doit faire partie du document pour que nous puissions le soumettre.
    $(document.body).append(form);
    form.submit();
}

7 votes

Légèrement modifié cela pour supporter les tableaux et les objets gist.github.com/hom3chuk/692bf12fe7dac2486212

3 votes

Si la valeur contient un caractère XML dangereux, cela ne fonctionnera pas dans ASP.NET encodeUriComponent(value) est requis. Ensuite, UrlDecode est également requis côté serveur.

0 votes

Si vos besoins sont simples, alors cette fonction est inutile. Cette fonction d'une seule ligne est suffisante : `$("

").appendTo("body").submit();`

79voto

Alexandre Victoor Points 1814

Une mise en œuvre simple et rapide de la réponse de @Aaron :

document.body.innerHTML += '';
document.getElementById("dynForm").submit();

Bien sûr, vous devriez plutôt utiliser un framework JavaScript tel que Prototype ou jQuery...

6 votes

Y a-t-il un moyen de le faire sans qu'une page web ne soit chargée dans la fenêtre/onglet du navigateur actuel?

0 votes

Comment insérer le jeton CSRF ici ?

0 votes

@Shulz Vous pouvez ajouter un autre champ de saisie masqué avec [name] défini sur la clé, et [value] défini sur la valeur du jeton.

55voto

insin Points 19509

En utilisant la fonction createElement fournie dans cette réponse, qui est nécessaire en raison du problème de l'attribut name d'IE sur les éléments créés normalement avec document.createElement:

function postToURL(url, values) {
    values = values || {};

    var form = createElement("form", {action: url,
                                      method: "POST",
                                      style: "display: none"});
    for (var property in values) {
        if (values.hasOwnProperty(property)) {
            var value = values[property];
            if (value instanceof Array) {
                for (var i = 0, l = value.length; i < l; i++) {
                    form.appendChild(createElement("input", {type: "hidden",
                                                             name: property,
                                                             value: value[i]}));
                }
            }
            else {
                form.appendChild(createElement("input", {type: "hidden",
                                                         name: property,
                                                         value: value}));
            }
        }
    }
    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
}

6 votes

Avez-vous besoin de supprimer l'enfant après la soumission? La page ne disparaît-elle pas de toute façon?

2 votes

Il est inutile de supprimer l'enfant après soumission, sauf si une session est utilisée et que ces données sont enregistrées.

6 votes

@CantucciHQ La page pourrait tout aussi bien rester inchangée même si la cible du formulaire n'est pas définie. Il y a 204 No Content, par exemple.

27voto

Head Points 2233

Si vous avez Prototype installé, vous pouvez resserrer le code pour générer et soumettre le formulaire caché de cette manière:

 var form = new Element('form',
                        {method: 'post', action: 'http://example.com/'});
 form.insert(new Element('input',
                         {name: 'q', value: 'a', type: 'hidden'}));
 $(document.body).insert(form);
 form.submit();

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