PHP - перенаправить и отправить данные через POST - PullRequest
46 голосов
/ 15 июня 2010

У меня есть онлайн-шлюз, который требует отправки HTML-формы со скрытыми полями. Мне нужно сделать это через PHP-скрипт без каких-либо HTML-форм (у меня есть данные для скрытых полей в БД)

Для этого отправка данных через GET:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John');

А для этого нужно отправлять данные через POST?

Ответы [ 14 ]

42 голосов
/ 15 июня 2010

Вы не можете сделать это с помощью PHP.

Как уже говорили другие, вы можете использовать cURL - но тогда код PHP становится клиентом, а не браузером.

Если вам необходимоиспользуйте POST, тогда единственный способ сделать это - сгенерировать заполненную форму с использованием PHP и использовать обработчик window.onload для вызова javascript для отправки формы.

C.

32 голосов
/ 07 марта 2013

вот образец обходного пути.

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;
}
9 голосов
/ 10 сентября 2014

Другое решение, если вы хотите избежать скручивания вызова и перенаправить браузер, как обычно, и имитировать вызов 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 голосов
/ 18 марта 2018

Я нашел лучшее и более аккуратное решение, поэтому подумал, что должен поделиться им:

Используйте сеанс:

$_SESSION['POST'] = $_POST;

, а для запроса заголовка перенаправления вы должны использовать:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)

307 - это htttp_response_code, который можно использовать для запроса перенаправления с отправленными значениями POST.

4 голосов
/ 15 июня 2010

Это будет включать расширение 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);
3 голосов
/ 17 июля 2013
/**
 * 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");
    }
}
1 голос
/ 16 декабря 2014

Кроме того, установка переменной сеанса перед перенаправлением и проверка ее в целевом URL может решить эту проблему для меня.

1 голос
/ 15 июня 2010

Вы должны открыть сокет для сайта с помощью fsockopen и имитировать HTTP-Post-Request. Google покажет вам много фрагментов, как имитировать запрос.

1 голос
/ 15 июня 2010

Для этого используйте 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».Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь.Это может быть либо передано в виде строки в кодировке urlen, например, 'para1 = val1¶2 = val2 & ...', либо в виде массива с именем поля в качестве ключа и данными поля в качестве значения.Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data.

0 голосов
/ 25 мая 2017

Обходной путь, который отлично работает:

На исходной странице, начните открывать сеанс и назначьте столько значений, сколько вы хотите.Затем выполните перемещение с помощью «заголовка»:

<!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. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...