Итак, в API моего веб-приложения у меня есть входящий HTTP-запрос. Я хотел бы передать этот запрос POST на другой сервер, не теряя данные в заголовке POST. Это возможно? какой тип перенаправления я бы использовал? Примеры php?
Изменить: HTTP-запрос поступает из мобильного приложения, а не из веб-браузера.
Благодаря!
Вы можете использовать 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);
RewriteRule current-page.php http://www.newserver.com/newpage.php [NC,P]
P там (прокси) сохранит данные POST. Вам нужно будет включить прокси-модуль apache, если он еще не установлен.
Я знаю, что это старый вопрос, но это может помочь людям, которые спотыкаются на этот вопрос. Вы должны иметь возможность отправить код ответа HTTP 307, чтобы заставить агента пользователя перенаправлять новый URL-адрес и продолжать использовать тот же метод и данные. Этот ответ содержит более подробную информацию
Если HTTP-библиотека клиента (т. Е. Мобильное приложение) поддерживает это, вы можете вернуть HTTP 307 с сервера, который заявляет, что «запрос должен быть повторен с другим URI … с тем же методом». Это по существу временное перенаправление, но говорит клиенту использовать тот же метод, POST.
Клиент, выполняющий запрос, должен иметь возможность отвечать на ответ HTTP 307 и следовать переадресации с помощью того же метода – для многих библиотек это может быть дополнительный флаг или параметр.
Вы не можете сообщить браузеру, чтобы он отправлял запрос через 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 на своем сервере, а затем отобразить результаты.
Я использовал следующий код для перенаправления сообщения. В моем случае я использую только тип содержимого приложения / октета-потока, поэтому обязательно учтите это.
$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);
Я думаю, что решение, с которым я собираюсь пойти, это что-то вроде:
<? $url = 'http://myserver.com/file.php'; foreach ($_POST as $key => $value) { $text .= (strlen($text) > 0 ? '&' : ''); $text .= $key . '=' . $value; } header('Location: ' . $url . '?' . $text); exit; ?>
Может ли кто-нибудь подумать о причине, почему это плохая идея?
Если вы хотите взять данные из запроса POST и просто отправить POST на другой сервер, используйте cURL .
–или–
Если вы хотите взять данные из запроса POST и перенаправить клиента на этот другой сервер, а POSTing данных, используйте этот метод …
Динамически формировать форму со всеми данными 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();