我们需要进行表单提交并保存一些数据,然后将用户重定向到站点外的页面,但是在重定向过程中,我们需要使用POST而不是GET“提交”表单。

我希望有一个简单的方法来完成这一点,但我开始觉得没有。我想我现在必须创建一个简单的另一个页面,只有我想要的表单,重定向到它,填充表单变量,然后做一个主体。Onload调用脚本,只调用document.forms[0].submit();

谁能告诉我还有别的选择吗?我们可能需要在项目后期进行调整,它可能会变得有点复杂,所以如果有一个简单的方法,我们可以做所有不依赖于其他页面的事情,那就太棒了。

无论如何,感谢所有的回复。


当前回答

在PHP中,您可以使用cURL发送POST数据。是否有与。net类似的东西?

是的,HttpWebRequest,请看我下面的帖子。

其他回答

GET(和HEAD)方法绝不能用来做任何有副作用的事情。副作用可能是更新web应用程序的状态,或者可能是收取您的信用卡费用。如果某个操作有副作用,则应该使用另一种方法(POST)。

因此,用户(或他们的浏览器)不应该对GET所做的事情负责。如果由于GET而产生了一些有害或昂贵的副作用,那将是web应用程序的错,而不是用户的错。根据规范,用户代理不能自动跟踪重定向,除非它是对GET或HEAD请求的响应。

当然,许多GET请求确实有一些副作用,即使它只是附加到日志文件中。重要的是,对这些影响负责的应该是应用程序,而不是用户。

HTTP规范的相关章节是9.1.1、9.1.2和10.3。

认为这可能是有趣的分享,heroku这样做与它的SSO到附加组件提供程序

它如何工作的例子可以在“kensa”工具的源代码中看到:

https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb

并且可以在实践中看到,如果你转向javascript。示例页面来源:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Heroku Add-ons SSO</title>
  </head>

  <body>
    <form method="POST" action="https://XXXXXXXX/sso/login">

        <input type="hidden" name="email" value="XXXXXXXX" />

        <input type="hidden" name="app" value="XXXXXXXXXX" />

        <input type="hidden" name="id" value="XXXXXXXX" />

        <input type="hidden" name="timestamp" value="1382728968" />

        <input type="hidden" name="token" value="XXXXXXX" />

        <input type="hidden" name="nav-data" value="XXXXXXXXX" />

    </form>

    <script type="text/javascript">
      document.forms[0].submit();
    </script>
  </body>
</html>

PostbackUrl可以在asp按钮上设置,以便发布到不同的页面。

如果你需要在代码背后,尝试Server.Transfer。

我会这么做:

将数据放入标准表单(不带runat="server"属性),并将表单的动作设置为发布到目标场外页面。 在提交之前,我将使用XmlHttpRequest将数据提交到服务器并分析响应。如果响应意味着你应该继续与场外张贴然后我(JavaScript)将继续与张贴,否则我会重定向到我的网站上的一个页面

你可以使用这个方法:

Response.Clear();

StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);
// Other params go here
sb.Append("</form>");
sb.Append("</body>");
sb.Append("</html>");

Response.Write(sb.ToString());

Response.End();

结果,在客户端从服务器获取所有html后,onload事件发生,触发表单提交并将所有数据发布到定义的postbackUrl。