Nous avons l'obligation de prendre une soumission de formulaire et d'enregistrer certaines données, puis de rediriger l'utilisateur vers une page hors site, mais lors de la redirection, nous devons «soumettre» un formulaire avec POST, pas GET.
J'espérais qu'il y avait un moyen facile d'accomplir cela, mais je commence à penser qu'il n'y en a pas. Je pense que je dois maintenant créer une autre page simple, avec juste le formulaire que je veux, y rediriger, remplir les variables du formulaire, puis faire un appel body.onload à un script qui appelle simplement document.forms [0] .submit ( );
Quelqu'un peut-il me dire s'il existe une alternative? Nous pourrions avoir besoin de modifier cela plus tard dans le projet, et cela pourrait devenir un peu compliqué, donc s'il y avait un moyen facile, nous pourrions faire tout cela sans autre page dépendante, ce serait fantastique.
Quoi qu'il en soit, merci pour toutes les réponses.
la source
Réponses:
Pour ce faire, vous devez comprendre le fonctionnement des redirections HTTP. Lorsque vous utilisez
Response.Redirect()
, vous envoyez une réponse (au navigateur qui a fait la demande) avec le code d'état HTTP 302 , qui indique au navigateur où aller ensuite. Par définition, le navigateur le fera via uneGET
demande, même si la demande d'origine était unPOST
.Une autre option consiste à utiliser le code d'état HTTP 307 , qui spécifie que le navigateur doit effectuer la demande de redirection de la même manière que la demande d'origine, mais pour inviter l'utilisateur avec un avertissement de sécurité. Pour ce faire, vous écririez quelque chose comme ceci:
Malheureusement, cela ne fonctionnera pas toujours. Différents navigateurs l'implémentent différemment , car ce n'est pas un code d'état commun.
Donc, pour autant que je sache, la seule façon d'implémenter quelque chose comme ça serait d'utiliser Javascript. Il y a deux options auxquelles je peux penser du haut de ma tête:
action
faites pointer son attribut vers le serveur tiers. Ensuite, ajoutez un événement de clic au bouton d'envoi qui exécute d'abord une demande AJAX à votre serveur avec les données, puis autorise l'envoi du formulaire au serveur tiers.Des deux, je choisirais la seconde, pour deux raisons. Premièrement, il est plus fiable que le premier car Javascript n'est pas nécessaire pour qu'il fonctionne; pour ceux qui ne l'ont pas activé, vous pouvez toujours rendre visible le bouton d'envoi du formulaire masqué et leur demander d'appuyer dessus si cela prend plus de 5 secondes. Deuxièmement, vous pouvez décider quelles données seront transmises au serveur tiers; si vous utilisez simplement traiter le formulaire au fur et à mesure, vous transmettrez toutes les données de publication, ce qui n'est pas toujours ce que vous voulez. Idem pour la solution 307, en supposant qu'elle fonctionne pour tous vos utilisateurs.
J'espère que cela t'aides!
la source
Vous pouvez utiliser cette approche:
Comme résultat juste après client obtenir tous les fichiers html du serveur l'événement OnLoad lieu que les déclencheurs forment et soumettre des données à afficher toutes PostBackUrl définies.
la source
HttpWebRequest est utilisé pour cela.
Lors de la publication, créez un HttpWebRequest à votre tiers et publiez les données du formulaire, puis une fois cela fait, vous pouvez Response.Redirect où vous le souhaitez.
Vous obtenez l'avantage supplémentaire que vous n'avez pas à nommer tous vos contrôles serveur pour créer le formulaire tiers, vous pouvez faire cette traduction lors de la création de la chaîne POST.
Cependant, si vous avez besoin que l'utilisateur voie la page de réponse de ce formulaire, votre seule option est d'utiliser Server.Transfer, et cela peut ou peut ne pas fonctionner.
la source
Cela devrait vous faciliter la vie. Vous pouvez simplement utiliser facilement la méthode Response.RedirectWithData (...) dans votre application Web.
la source
Une nouveauté d'ASP.Net 3.5 est cette propriété "PostBackUrl" des boutons ASP. Vous pouvez le définir à l'adresse de la page que vous souhaitez publier directement, et lorsque vous cliquez sur ce bouton, au lieu de le renvoyer sur la même page comme d'habitude, il publie à la place sur la page que vous avez indiquée. Pratique. Assurez-vous que UseSubmitBehavior est également défini sur TRUE.
la source
J'ai pensé qu'il pourrait être intéressant de partager que Heroku le fait avec son fournisseur SSO to Add-on
Un exemple de comment cela fonctionne peut être vu dans la source de l'outil "kensa":
https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb
Et peut être vu dans la pratique si vous désactivez javascript. Exemple de source de page:
la source
PostbackUrl peut être défini sur votre bouton asp pour publier sur une autre page.
si vous devez le faire dans codebehind, essayez Server.Transfer.
la source
@Mat,
Vous pouvez toujours utiliser HttpWebRequest, puis diriger la réponse que vous recevez vers la réponse de flux de sortie réelle, cela servirait la réponse à l'utilisateur. Le seul problème est que toutes les URL relatives seraient rompues.
Pourtant, cela peut fonctionner.
la source
Voici ce que je ferais:
Mettez les données dans un formulaire standard (sans attribut runat = "server") et définissez l'action du formulaire à publier sur la page hors site cible. Avant de soumettre, je soumettais les données à mon serveur à l' aide d'un XmlHttpRequest et j'analysais la réponse. Si la réponse signifie que vous devriez aller de l'avant avec le POSTing hors site, je (le JavaScript) procéderais au post, sinon je redirigerais vers une page de mon site
la source
Oui, HttpWebRequest, voir mon article ci-dessous.
la source
La méthode GET (et HEAD) ne doit jamais être utilisée pour faire quoi que ce soit qui a des effets secondaires. Un effet secondaire peut être la mise à jour de l'état d'une application Web ou le chargement de votre carte de crédit. Si une action a des effets secondaires, une autre méthode (POST) doit être utilisée à la place.
Ainsi, un utilisateur (ou son navigateur) ne devrait pas être tenu responsable de quelque chose fait par un GET. Si un effet secondaire nocif ou coûteux se produisait à la suite d'un GET, ce serait la faute de l'application Web, pas de l'utilisateur. Selon la spécification, un agent utilisateur ne doit pas suivre automatiquement une redirection, sauf s'il s'agit d'une réponse à une demande GET ou HEAD.
Bien sûr, de nombreuses demandes GET ont des effets secondaires, même si elles ne font que s'ajouter à un fichier journal. L'important est que l'application, et non l'utilisateur, soit tenue pour responsable de ces effets.
Les sections pertinentes de la spécification HTTP sont 9.1.1 et 9.1.2 et 10.3 .
la source
Je suggère de créer un HttpWebRequest pour exécuter votre POST par programme, puis rediriger après avoir lu la réponse, le cas échéant.
la source
Code copiable-collable basé sur la méthode de Pavlo Neyman
RedirectPost (chaîne url, T bodyPayload) et GetPostData () sont pour ceux qui veulent simplement vider des données fortement typées dans la page source et les récupérer dans la cible. Les données doivent être sérialisables par NewtonSoft Json.NET et vous devez bien sûr référencer la bibliothèque.
Copiez-collez simplement dans vos pages ou, mieux encore, classe de base pour vos pages et utilisez-le n'importe où dans votre application.
Mon cœur va à vous tous qui devez encore utiliser les formulaires Web en 2019 pour une raison quelconque.
la source
En règle générale, tout ce dont vous aurez besoin est de transporter un état entre ces deux demandes. Il y a en fait une façon vraiment funky de faire cela qui ne repose pas sur JavaScript (pensez <noscript />).
Avec ce cookie là, vous pouvez dans la demande suivante à /redirect.html récupérer les informations nom = valeur, vous pouvez stocker tout type d'informations dans cette chaîne de paire nom / valeur, jusqu'à 4K de données (limite de cookie typique). Bien sûr, vous devez éviter cela et stocker à la place les codes d'état et les bits d'indicateur.
Dès réception de cette demande, vous répondez en retour par une demande de suppression de ce code d'état.
Mon HTTP est un peu rouillé J'ai parcouru les RFC2109 et RFC2965 pour comprendre à quel point c'est vraiment fiable, de préférence je voudrais que le cookie fasse un aller-retour exactement une fois mais cela ne semble pas être possible, aussi, les cookies tiers peut être un problème pour vous si vous déménagez dans un autre domaine. C'est toujours possible, mais pas aussi indolore que lorsque vous faites des choses dans votre propre domaine.
Le problème ici est la concurrence, si un utilisateur avancé utilise plusieurs onglets et parvient à entrelacer quelques demandes appartenant à la même session (ce qui est très peu probable, mais pas impossible), cela peut entraîner des incohérences dans votre application.
C'est la façon <noscript /> de faire des allers-retours HTTP sans URL sans signification et JavaScript
Je fournis ce code comme un prof de concept: si ce code est exécuté dans un contexte que vous ne connaissez pas, je pense que vous pouvez déterminer quelle partie est quoi.
L'idée est que vous appelez Relocate avec un certain état lorsque vous redirigez, et l'URL que vous avez déplacé appelle GetState pour obtenir les données (le cas échéant).
la source