web-dev-qa-db-fra.com

Un bon moyen de rediriger avec une requête POST?

J'ai besoin de rediriger un utilisateur vers un site externe via une requête POST.

La seule option que j'ai trouvée est de le faire, de soumettre un formulaire via JavaScript.


Des idées?

19
RadiantHex

Ce que vous voulez dire n'est pas tout à fait clair, alors prenons quelques scénarios:

  1. L'utilisateur doit POST se former sur un serveur autre que le vôtre

    Facile, spécifiez simplement la cible comme action de formulaire:

    <form action="http://someotherserver.com" method="post">
    
  2. L'utilisateur doit être redirigé après une soumission réussie POST

    Facile, acceptez et traitez les données POST comme d'habitude, puis répondez avec un en-tête de redirection 302 Ou 303.

  3. L'utilisateur doit POST données sur votre serveur et, après validation, vous voulez POST ces données sur un autre serveur

    Légèrement délicat, mais trois options:

    • Votre serveur accepte les données POST et pendant que l'utilisateur attend une réponse, vous établissez une connexion à un autre serveur, POSTANT les données, recevant une réponse, puis renvoyez une réponse à l'utilisateur.
    • Vous répondez avec une redirection 307, Ce qui signifie que l'utilisateur doit tenter la même demande à une autre adresse. Théoriquement, cela signifie que le navigateur doit POST les mêmes données sur un autre serveur. Je ne sais pas si cela est bien pris en charge, mais tout navigateur comprenant HTTP1.1 devrait être en mesure de le faire. AFAIA n'est pas souvent utilisé dans la pratique.
      PS: La spécification dit qu'une redirection 307 POST doit être au moins reconnue par l'utilisateur. Hélas, apparemment, aucun navigateur ne respecte les spécifications ici. IE répète simplement la demande (donc cela fonctionne pour vos besoins), mais Firefox, Safari et Opera semblent rejeter les données POST. Par conséquent, cette technique n'est malheureusement pas fiable.
    • Utilisez la technique n ° 1 combinée avec des champs de formulaire masqués, en ajoutant une étape entre les deux.

Voir ici pour une liste de toutes les options de redirection HTTP: http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

34
deceze

Définissez simplement l'URL d'action du formulaire HTML sur le site externe particulier.

Voici un SSCCE , copiez-le simplement et copiez-le:

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2604530</title>
    </head>
    <body>
        <form action="http://stackoverflow.com/questions/2604530/answer/submit" method="post">
            <textarea name="post-text"></textarea>
            <input type="submit" value="Post Your Answer">
        </form>
    </body>
</html>

Vous verrez que Stackoverflow a une bonne protection CSRF;)

5
BalusC

Javascript est le seul moyen (de le faire automatiquement). Vous ne pouvez tout simplement pas rediriger une requête POST via les méthodes standard http. Êtes-vous sûr que GET n'est pas une option ici?

2
Wolph

L'utilisation d'un formulaire est probablement votre seule option en tant que liens, redirections HTTP et <meta http-equiv="refresh" > ne fera que charger le navigateur d'une autre URL en utilisant la méthode GET .

Cependant, vous n'avez pas nécessairement besoin d'utiliser JavaScript pour soumettre un formulaire. Si une certaine interaction de l'utilisateur est acceptable, vous pouvez utiliser un formulaire avec des <input type="hidden"> et laissez l'utilisateur appuyer sur le bouton d'envoi.

Vous pouvez également vous assurer que la page vers laquelle vous redirigez n'accepte pas déjà les paramètres GET. Certains scripts acceptent à la fois GET et POST sans distinction.

0
Alex Jasmin