PHP - перенаправление и отправка данных через POST
У меня есть онлайн-шлюз, который требует отправки HTML-формы со скрытыми полями. Мне нужно сделать это с помощью PHP script без каких-либо HTML-форм (у меня есть данные для скрытых полей в БД)
Для этого отправьте данные через GET:
header('Location: http://www.provider.com/process.jsp?id=12345&name=John');
И для отправки данных через POST?
Ответы
Ответ 1
Вы не можете сделать это с помощью PHP.
Как говорили другие, вы можете использовать cURL - но тогда код PHP становится клиентом, а не браузером.
Если вы должны использовать POST, то единственным способом сделать это будет создание заполненной формы с использованием PHP и использование hook.onload для вызова javascript для отправки формы.
С.
Ответ 2
вот пример обходного пути.
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;
}
Ответ 3
Другое решение, если вы хотите избежать зависания и перенаправить браузер, как обычно, и подражать вызову POST:
сохранить сообщение и сделать временное перенаправление:
function post_redirect($url) {
$_SESSION['post_data'] = $_POST;
header('Location: ' . $url);
}
Затем всегда проверяйте переменную сеанса post_data
:
if (isset($_SESSION['post_data'])) {
$_POST = $_SESSION['post_data'];
$_SERVER['REQUEST_METHOD'] = 'POST';
unset($_SESSION['post_data']);
}
Появятся некоторые отсутствующие компоненты, такие как apache_request_headers() не будут отображаться заголовок содержимого POST и т.д.
Ответ 4
Он будет включать расширение 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);
Ответ 5
/**
* Redirect with POST data.
*
* @param string $url URL.
* @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123)
* @param array $headers Optional. Extra headers to send.
*/
public function redirect_post($url, array $data, array $headers = null) {
$params = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($data)
)
);
if (!is_null($headers)) {
$params['http']['header'] = '';
foreach ($headers as $k => $v) {
$params['http']['header'] .= "$k: $v\n";
}
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if ($fp) {
echo @stream_get_contents($fp);
die();
} else {
// Error
throw new Exception("Error loading '$url', $php_errormsg");
}
}
Ответ 6
Используйте curl для этого. Google для "curl php post", и вы найдете следующее: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html.
Обратите внимание, что вы также можете использовать массив для параметра CURLOPT_POSTFIELDS. От php.net docs:
Полные данные для публикации в HTTP-режиме "POST". Чтобы опубликовать файл, добавьте имя файла с помощью @и используйте полный путь. Это может быть передано как строка с urlencoded, такая как "para1 = val1 & para2 = val2 &..." или как массив с именем поля в качестве ключа и данными поля в качестве значения. Если значением является массив, заголовок Content-Type будет установлен в multipart/form-data.
Ответ 7
Вам нужно открыть сокет на сайте fsockopen
и смоделировать HTTP-Post-Request.
Google покажет вам много фрагментов, как имитировать запрос.
Ответ 8
В качестве альтернативы, установка переменной сеанса перед перенаправлением и проверка ее в URL-адресе адресата может решить эту проблему для меня.
Ответ 9
Я буду бояться, что вам понадобится CURL для этой задачи. Хороший простой способ сделать это здесь: http://davidwalsh.name/execute-http-post-php-curl
Надеюсь, что поможет
Ответ 10
Я использовал следующий код для сбора данных POST, которые были отправлены из form.php, и затем объединить его в URL-адрес, чтобы отправить его BACK в форму для исправлений валидации. Работает как шарм и фактически преобразует данные POST в данные GET.
foreach($_POST as $key => $value) {
$urlArray[] = $key."=".$value;
}
$urlString = implode("&", $urlArray);
echo "Please <a href='form.php?".$urlString."'>go back</a>";
Ответ 11
Да, вы можете сделать это в PHP, например. в
Силекс или 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);
Ответ 12
Старый пост, но вот как я его обработал. Использование метода 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);
}
}
Ответ 13
Обходной путь, который отлично работает:
На исходной странице запустите сеанс и назначьте столько значений, сколько захотите.
Затем выполните перемещение с помощью "header":
<!DOCTYPE html>
<html>
<head>
<?php
session_start();
$_SESSION['val1'] = val1;
...
$_SESSION['valn'] = valn;
header('Location: http//Page-to-redirect-to');
?>
</head>
</html>
И затем, на большой странице:
<!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.
Удачи!
Ответ 14
Я нашел лучшее и более быстрое решение, поэтому я подумал, что должен поделиться им:
Используйте сеанс:
$_SESSION['POST'] = $_POST;
и для запроса заголовка перенаправления вы должны использовать:
header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)
307
- это htttp_response_code
, который вы могли бы использовать для запроса перенаправления с представленными значениями POST
.