envoyer des données en POST + faire une redirection

Nouveau WRInaute
Bonjour

J'ai fait pas mal de recherches depuis quelques temps sur comment envoyer des données en POST sans passer par un formulaire.

J'ai trouvé plusieurs techniques qui marchent:
- en utilisant CURL
- en utilisant fsockopen

Le problème c'est que j'arrive bien à envoyer les données en POST mais il me manque la redirection donc j'ai besoin.
En effet, ces 2 techniques permettent de récupérer les informations de l'autre page mais elles n'envoient pas sur l'autre page.

Donc pour résumé, j'ai un fichier fichier.php avec des données.
Je veux envoyer des données de fichier.php automatiquement en POST vers fichier2.php et arriver sur fichier2.php où je pourrai lire mes données passées en POST.

Et donc avez vous une idée comment je peux faire pour envoyer des données automatiquement en POST vers une page et être redirigé vers cette page?

Merci de votre aide.
 
WRInaute accro
Je ne comprends pas bien ce que tu cherches à faire... Qui doit "arriver" sur fichier2? Y a-t-il un utilisateur, que fait-il?

S'il y a un utilisateur, curl ou fsockopen sont entre ton serveur (qui est alors client) et un autre serveur, c'est une connexion complètement indépendante de celle entre l'utilisateur et ton serveur:

utilisateur <- connexion HTTP -> script 1 <- connexion HTTP -> script 2

Si tu veux que l'utilisateur voie le résultat de script 2, il faut récupérer ce que renvoie curl ou le file description ouvert avec fsockopen, et l'envoyer à l'utilisateur (en gros ton script 1 va jouer le rôle d'un proxy).

L'autre solution si ce n'est pas ça que tu veux, c'est que script 1 génère un formulaire HTML pré-rempli (éventuellement avec juste des hidden) et un bout de JS qui fait un document.getElementById('id_du_form').submit(); pour renvoyer automatiquement vers le deuxième script. C'est le seul moyen de faire une "redirection" avec un POST.

Bref, si tu nous disais exactement ce que tu veux faire, ça nous aiderait probablement à te donner la bonne solution.

Jacques.
 
Nouveau WRInaute
Je vais essayer d'être le plus claire possible.

Je vais prendre un exemple simple, merci de ne pas critiquer mon exemple :wink:

1--> formulaire dans fichier.php qui envoie des données en POST
2--> récupération des données du formulaire dans fichier2.php
3--> traitement des données et renvoie automatiquement des données en POST vers fichier3.php
4--> lecture des données dans fichier3.php

Comme tu le vois, c'est au niveau du 3 que j'ai un soucis.
Le fichier2.php ne doit pas être vu par l'utilisateur, c'est pour cela que l'envoie en POST doit être fait automatiquement.

Mon exemple t'éclaire mieux?
 
WRInaute accro
Non, ce n'est toujours pas clair. Soit A l'utilisateur, B le serveur sur lequel se trouve fichier.php (et éventuellement C et D les serveurs où se trouvent fichier2.php et fichier3.php, s'ils sont différents de B), quelles sont les interactions que tu veux? Que doit voir et que doit faire A à chaque étape?

Moi ce que je comprends c'est:
1. A fait une requête sur B/fichier.php, qui lui envoie une page HTML avec un formulaire à remplir
2. A remplit le formulaire, et clique sur OK.
3. Le formulaire est envoyé à B/fichier2.php. Il fait sa sauce, et en déduit de nouvelles données.
4. On veut que ces données soient envoyées en POST à B/fichier3.php
5. On veut que ce que B/fichier3.php a renvoyé soit affiché à A

Dans ce cas, il y a effectivement les deux options évoquées plus haut:
option 1: fichier2.php fait un curl ou fsockopen, envoie les données qu'il veut en POST à fichier3.php, recupère les infos, et les affiche à l'utilisateur (c'est donc une sorte de proxy)

option 2: fichier2.php génère une page html avec un <form>, plein de <input type="hidden"> qui contiennent les données à transmettre à fichier3.php, et un bout de JS qui fait un submit sur le form automatiquement. Dans ce cas, le navigateur va recevoir le formulaire et faire immédiatement un POST vers fichier3, et recevoir en retour ce que ce dernier script renvoie et va l'afficher

Evidemment si fichier2 et fichier3 sont sur la même machine, c'est un peu du gâchis. Mais mon petit doigt me dit qu'il ne sont pas sur la même machine, et que tu essaies juste de "scripter" un formulaire existant sur un autre serveur. Suivant les besoins (cohérence de l'IP, de l'UA, des cookies par exemple), l'une ou l'autre solution peut être plus adaptée.

Jacques.
 
Nouveau WRInaute
Tu as tout à fait compris ce que je voulais :)

Comme je l'ai expliqué au dessus, avec curl ou fsockopen, je récupère les données de fichier3.php mais je reste sur fichier2.php ce qui n'est pas bien puisque fichier2.php ne doit pas être vu par l'utilisateur.

Et ta méthode dans option 2 est une méthode que j'avais déjà pensé mais je trouve cela étrange de devoir envoyer un formulaire automatiquement via du javascript et si la personne désactive son javascript tu te retrouves avec une personne bloquée sur une page intermédiaire, autre soucis, si la personne bloque son navigateur au moment ou tu te trouves sur la page fichier2.php, elle peut alors lire toutes les données qui sont passées dans le formulaire(si j'utilise un fichier2.php, c'est justement pour que le traitement fait, soit confidentiel).

Merci de ton aide.
 
WRInaute passionné
tu ne peux pas appeler directement fichier3 et faire le traitement fait dans le fichier2 en plus?
 
Nouveau WRInaute
Non je ne peux pas.

Il doit bien y avoir une solution quand même pour envoyer des données automatiquement en POST.
 
WRInaute passionné
pour passer par fichier2 il faut bien que tu mettes dans ton <form> l'adresse de ce fichier2. Il est donc connu. Je ne vois pas le problème dans ce cas d'utiliser curl pour récupérer le résultat de fichier3 et de le renvoyer comme résultat de fichier2.
 
Nouveau WRInaute
Avec curl tu récupères les données de l'autre page mais tu restes sur la même page.

fichier2 est connu puisque comme tu le dis il est visible via le formulaire de fichier1 mais ce n'est pas pour cela que j'ai envie que la personne reste dessus.

fichier2 est juste là pour être un fichier de test des données récupérées dans fichier1, mais on peut très bien imaginer que fichier2 renvoie après les données dans fichier1 pour faire une boucle.

Ce que je recherche vraiment c'est une fonction qui fasse comme curl mais avec une redirection.

Je ne sais pas si je reste assez claire...
 
WRInaute accro
curl ou fsockopen se passent entre le serveur de fichier2 et le serveur de fichier3. La redirection dont tu parles se ferait forcément au niveau du client. Donc forcément il ne s'agit pas de la même chose. Il n'y a pas 36 solutions, il n'y a que les 2 évoquées plus haut: soit c'est le serveur de fichier2 qui parle au serveur de fichier3, soit c'est le serveur de fichier2 qui dit au client d'aller parler à fichier3. A partir du moment où un POST est obligatoire pour fichier3, pas de miracle, c'est form+JS (tu peux toujours mettre un bouton pour que l'utilisateur qui a désactivé JS -ça existe encore?- puisse activer le formulaire même sans JS).

Code:
A = client
B = serveur fichier1
C = serveur fichier2
D = serveur fichier3

Option 1:
A --requête GET-----------> B
A <--HTML avec formulaire-- B
A --requête POST----------> C
                            C --requête POST--> D
                            C <--résultat------ D
A <--résultat-------------- C

Option 2:
A --requête GET-------------------------> B
A <--HTML avec formulaire---------------- B
A --requête POST------------------------> C
A <--HTML avec formulaire + auto-submit-- C
A --requête POST------------------------> D
A <--résultat---------------------------- D

Dans l'option 1, tu peux éventuellement rajouter un redirect vers une autre page encore (fichier4) plutôt que d'afficher directement le résultat, mais tu seras limité à un GET, donc à une quantité de données assez limitée à passer dans l'URL (ou alors, si fichier2 et fichier4 sont sur la même machine, via un fichier temporaire, une entrée en BDD, etc.). Mais tu ne peux pas renvoyer vers fichier3, puisque tu es déjà allé faire le POST et chercher le résultat chez lui.

Jacques.

EDIT: alignement
 
WRInaute accro
Cette option ne fait que dire à curl de suivre un redirect, mais ça se passe toujours entre le serveur initial et le(s) serveur(s) distant(s), ça n'a aucune influence sur ce qui se passe côté client. Et ici il ne veut pas suivre une redirection, il veut en déclencher une.

Jacques.
 
Nouveau WRInaute
Merci de vos réponses

@spout
Comme le dit jcaron, il n'y a pas la redirection derrière.

@jcaron
cela veut donc dire qu'il n'y a pas de solutions "propres" , on peut juste obtenir ce que je veux en magouillant.

C'est quand même étrange qu'il n'y ait pas une fonction qui sache faire cela.
 
WRInaute accro
Ben non, ce n'est pas spécialement un besoin classique. Un client fait une requête vers un serveur, et le POST est déjà un cas relativement particulier quand on en vient aux redirections, mais en plus tu veux modifier les données à envoyer, et en plus tu veux une nouvelle redirection après.

Il y a un moyen de faire un POST après une redirection (avec un 307), mais:
- les navigateurs qui respectent les normes vont afficher une demande de confirmation
- ça va retransmettre les mêmes données qu'initialement.

Je ne sais pas quel est ton besoin réel et précis, mais les deux options données fonctionnent très bien, je ne vois pas spécialement le problème ni avec l'une ni avec l'autre?

Jacques.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut