PHP-通过POST重定向和发送数据
我有一个在线网关,它要求提交一个带有隐藏字段的HTML表单。我需要通过一个没有任何HTML表单的PHP脚本来实现这一点(我有数据库中隐藏字段的数据) 要通过GET发送数据,请执行以下操作:PHP-通过POST重定向和发送数据,php,forms,post,scripting,Php,Forms,Post,Scripting,我有一个在线网关,它要求提交一个带有隐藏字段的HTML表单。我需要通过一个没有任何HTML表单的PHP脚本来实现这一点(我有数据库中隐藏字段的数据) 要通过GET发送数据,请执行以下操作: header('Location: http://www.provider.com/process.jsp?id=12345&name=John'); 要通过POST发送数据,请使用curl。谷歌搜索“curlphppost”,你会发现这个: 请注意,还可以为CURLOPT_POSTFIELDS选项
header('Location: http://www.provider.com/process.jsp?id=12345&name=John');
要通过POST发送数据,请使用curl。谷歌搜索“curlphppost”,你会发现这个: 请注意,还可以为CURLOPT_POSTFIELDS选项使用数组。从php.net文档: 要在HTTP“post”操作中发布的完整数据。若要发布文件,请在文件名前加@并使用完整路径。这可以作为urlencoded字符串(如“para1=val1¶2=val2&…”)传递,也可以作为以字段名为键、字段数据为值的数组传递。如果值是数组,则内容类型标头将设置为多部分/表单数据
它将涉及cURL-PHP扩展
$ch = curl_init('http://www.provider.com/process.jsp');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "id=12345&name=John");
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); // RETURN THE CONTENTS OF THE CALL
$resp = curl_exec($ch);
恐怕你需要卷发来完成那项任务。这是一个非常简单的方法:
希望这对你有所帮助,你不能用PHP来做这件事 正如其他人所说,您可以使用cURL,但是PHP代码将成为客户机而不是浏览器 如果必须使用POST,那么唯一的方法就是使用PHP生成填充的表单,并使用window.onload钩子调用javascript提交表单
C.您必须使用打开一个到站点的套接字,并模拟HTTP Post请求。
Google将向您展示许多如何模拟请求的代码片段。这是解决方案示例
function redirect_post($url, array $data)
{
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function closethisasap() {
document.forms["redirectpost"].submit();
}
</script>
</head>
<body onload="closethisasap();">
<form name="redirectpost" method="post" action="<? echo $url; ?>">
<?php
if ( !is_null($data) ) {
foreach ($data as $k => $v) {
echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> ';
}
}
?>
</form>
</body>
</html>
<?php
exit;
}
函数重定向\u post($url,数组$data)
{
?>
函数closethisaap(){
document.forms[“redirectpost”].submit();
}
我使用以下代码捕获从form.php提交的POST数据,然后将其连接到URL,将其发送回表单进行验证更正。其工作原理类似于一个符咒,实际上是将POST数据转换为GET数据
foreach($_POST as $key => $value) {
$urlArray[] = $key."=".$value;
}
$urlString = implode("&", $urlArray);
echo "Please <a href='form.php?".$urlString."'>go back</a>";
foreach($\u发布为$key=>$value){
$URLARY[]=$key.“=”$value;
}
$urlString=内爆(&,$URLARY);
回应“请”;
如果您希望避免curl调用,让浏览器像正常一样重定向并模拟POST调用,另一种解决方案是:
保存帖子并执行临时重定向:
function post_redirect($url) {
$_SESSION['post_data'] = $_POST;
header('Location: ' . $url);
}
然后始终检查会话变量post\u data
:
if (isset($_SESSION['post_data'])) {
$_POST = $_SESSION['post_data'];
$_SERVER['REQUEST_METHOD'] = 'POST';
unset($_SESSION['post_data']);
}
将有一些缺少的组件,例如apache_request_headers()将不显示帖子内容头等。或者,在重定向之前设置会话变量并在目标url中测试它,可以为我解决此问题。是的,您可以在PHP中执行此操作,例如在
Silex或Symfony3
使用子请求
$postParams = array(
'email' => $request->get('email'),
'agree_terms' => $request->get('agree_terms'),
);
$subRequest = Request::create('/register', 'POST', $postParams);
return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
这是一篇旧文章,但我是这样处理的。使用newms87的方法:
if($action == "redemption")
{
if($redemptionId != "")
{
$results = json_decode($rewards->redeemPoints($redemptionId));
if($results->success == true)
{
$redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete';
// put results in session and redirect back to same page passing an action paraameter
$_SESSION['post_data'] = json_encode($results);
header("Location:" . $redirectLocation);
exit();
}
}
}
elseif($action == "redemptionComplete")
{
// if data is in session pull it and unset it.
if(isset($_SESSION['post_data']))
{
$results = json_decode($_SESSION['post_data']);
unset($_SESSION['post_data']);
}
// if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page.
else
{
$redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml';
header("Location:" . $redirectLocation);
}
}
一个工作环境非常好:
在源页面中,开始打开会话,并根据需要分配尽可能多的值。
然后使用“header”重新定位:
然后,在targe页面中:
<!DOCTYPE html>
<?php
session_start();
?>
<html>
...
<body>
<?php
if (isset($_SESSION['val1']) && ... && isset($_SESSION['valn'])) {
YOUR CODE HERE based on $_SESSION['val1']...$_SESSION['valn'] values
}
?>
</body>
</html>
...
不需要Javascript或JQuery。。
祝你好运!更好、更整洁的解决方案是使用$\u会话:
使用会话:
$_SESSION['POST'] = $_POST;
对于重定向标头请求,请使用:
header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)
307
是您可以使用提交的POST
值来执行重定向请求的http\u response\u code
。奇怪的是,cURL并不是解决方案,因为我自己也使用过它。但我想您的解决方案也很有效。您可以使用jQuery$.POST方法。在这种情况下,您可以在选项之间进行选择是的,可以使用PHP和curl代理请求并将其转换为POST,但这意味着接收端容易受到CSRF的影响,并且/或者没有对请求应用基于会话的控制(您可以在传递给curl的参数中捏造一些,但不是全部)1) 2015年对308个重定向的支持非常有限2)对于任何问题,永久重定向几乎总是错误的答案。不幸的是,这不是要求的。他想通过重定向发布,而不是将POST转换为GET。此外,如果你想实现这一点,你也可以使用PHP的本机函数http\u build\u query()
。这是一个“肮脏的"解决方案,但绝对有效!我制作了一个类似的函数,但使用了显式的echo
,而不是关闭和重新打开
标记。我喜欢这种肮脏的东西。php标记可能需要设置为@DiegoDD:你有任何代码/要点,以便我可以复制吗?@Hiep,给你:肮脏但很好的解决方案我对php不熟悉。有什么办法吗要用它更改URL吗?此函数不会更改URL,但会重定向。我将$headers
保留为null
(我应该是吗?)。嘿,Matt,这在CURL中是不可能的。通过CURL,我们不会重定向。@rahul会CURL\u setopt($ch,CURLOPT\u FOLLOWLOCATION,true)
无法解决此问题?根据我的经验,CURLOPT_FOLLOWLOCATION
在Laravel控制器中不起作用。感谢您提供了最干净的肮脏解决方案。谢谢。您的解决方案是最好的。
$_SESSION['POST'] = $_POST;
header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)