Перенаправление HTTP POST - PullRequest
       42

Перенаправление HTTP POST

2 голосов
/ 09 февраля 2011

Хорошо, поэтому в API моего веб-приложения есть входящий HTTP-запрос на публикацию. Я хотел бы передать этот запрос POST на другой сервер, не теряя данные в заголовке POST. Это возможно? какой тип перенаправления я бы использовал? примеры php?

Изменить: HTTP-запрос поступает из мобильного приложения, а не веб-браузера.

Спасибо!

Ответы [ 8 ]

9 голосов
/ 09 февраля 2011

Вы можете использовать cURL или сокеты для повторной публикации данных, но вы не можете перенаправить их.

POST'ing на URL с помощью cURL:

$ch = curl_init('http://www.somewhere.com/that/receives/postdata.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
6 голосов
/ 09 февраля 2011
RewriteRule current-page.php http://www.newserver.com/newpage.php [NC,P]

P там (прокси) сохранит данные POST. Вам нужно будет включить прокси-модуль apache, если это еще не сделано.

4 голосов
/ 08 февраля 2013

Я знаю, что это старый вопрос, но он может помочь людям, которые наткнулись на этот вопрос. Вы должны иметь возможность отправить код ответа HTTP 307, чтобы пользовательский агент перенаправил на новый URL-адрес и продолжал использовать тот же метод и данные. Этот ответ содержит более подробную информацию

1 голос
/ 03 марта 2015

Если клиентская библиотека HTTP (т. Е. Мобильное приложение) поддерживает это, то вы можете вернуть HTTP 307 с сервера, который гласит, что «запрос должен быть повторен с другим URI ... тем же методом».По сути, это временное перенаправление, но клиенту следует использовать тот же метод, POST.

Клиент, отправляющий запрос, должен иметь возможность отвечать соответствующим образом на ответ HTTP 307 и выполнять перенаправление тем же методом.- для многих библиотек это может быть дополнительный флаг или настройка.

0 голосов
/ 30 марта 2017

Я использовал следующий код для перенаправления сообщения.В моем случае я использую только тип контента application / octet-stream, поэтому убедитесь, что вы учли это.

$request = file_get_contents ( "php://input" ); 

$arrContextOptions=array(
        "http" => array(
                "method" => "POST",
                "header" =>
                'Content-Type: application/octet-stream'. "\r\n".
                'Content-Length: ' . strlen($request) . "\r\n",
                "content" => $request,
        ),
        "ssl"=>array(
                "allow_self_signed"=>true,
                "verify_peer"=>false,
        ),
);
$arrContextOptions = stream_context_create($arrContextOptions);


header ( "HTTP/1.1" );
header ( "Content-Type: application/octet-stream" );

$result =  file_get_contents('http://thenewaddress.yes.it.works', false, $arrContextOptions);

file_put_contents("php://output", $result);
0 голосов
/ 16 февраля 2011

Я думаю, что решение, с которым я собираюсь пойти, это что-то вроде:

<?
$url = 'http://myserver.com/file.php';

foreach ($_POST as $key => $value) {
  $text .= (strlen($text) > 0 ? '&' : '');
  $text .= $key . '=' . $value;
}

header('Location: ' . $url . '?' . $text);
exit;
?>

Может кто-нибудь придумать причину, почему это плохая идея?

0 голосов
/ 09 февраля 2011

Если вы хотите взять данные из запроса POST и просто отправить их на другой сервер, используйте cURL .

- или -

Если вы хотите взять данные из запроса POST и перенаправить клиента на этот другой сервер во время отправки данных, используйте этот метод ...

Динамически генерировать форму со всеми данными POST. Что-то нравится это ...

echo "<form name=\"someform\" action=\"http://www.somewhereelse.com/someform.whatever\">";
foreach ($_POST as $key=>$value) {
    echo "<input type=\"hidden=\" name=\"" . htmlspecialchars($key) . "\" value=\"" . htmlspecialchars($value) . "\" />";
}
echo "</form>";

Затем отправьте эту форму с некоторым JavaScript, когда страница загрузится ...

document.forms['someform'].submit();
0 голосов
/ 09 февраля 2011

Вы не можете указать браузеру отправлять запрос через HTTP-заголовок.Заголовок location будет перенаправлять, но только для запросов GET или HEAD.

Вы можете обойти это ограничение, отображая страницу со скрытой формой с атрибутом метода, установленным в POST, и действием, установленным в URL-адрес.Вы хотите, чтобы браузер отправлял сообщения, а затем автоматически отправлял их при загрузке страницы.Пример:

<body onload="document.getElementById('form').submit();">
  <form id="form" action="http://example.com/form_handler.php" method="POST">
    <input type="hidden" name="param_1" value="data">
  </form>
</body>

Кроме того, вы можете сделать запрос POST на вашем сервере и затем отобразить результаты.

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