variable - PHP-Redirigir y enviar datos a través de POST
php redirect with post (14)
Tengo una puerta de enlace en línea que requiere que se envíe un formulario HTML con campos ocultos. Necesito hacer esto a través de un script PHP sin formularios HTML (tengo los datos para los campos ocultos en un DB)
Para hacer esto, envía datos a través de GET:
header(''Location: http://www.provider.com/process.jsp?id=12345&name=John'');
¿Y para hacer esto enviando datos a través de POST?
Alternativamente, establecer una variable de sesión antes de la redirección y probarla en la url de destino puede resolver este problema para mí.
Encontré una solución mejor y más ordenada, así que pensé que debería compartirla:
Usa la sesión:
$_SESSION[''POST''] = $_POST;
y para la solicitud de encabezado de redirección, debe usar:
header(''Location: http://www.provider.com/process.jsp?id=12345&name=John'', true, 307;)
307
es el htttp_response_code
que puede usar para la solicitud de redireccionamiento con valores POST
enviados.
Implicaría la extensión 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);
No puedes hacer esto usando PHP.
Como han dicho otros, podría usar cURL, pero luego el código PHP se convierte en el cliente y no en el navegador.
Si debe usar POST, entonces la única forma de hacerlo sería generar el formulario rellenado usando PHP y usar el gancho window.onload para llamar a javascript y enviar el formulario.
DO.
Otra solución si desea evitar una llamada curl y hacer que el navegador redirija como lo hace normalmente y que imite una llamada POST:
guarde la publicación y realice una redirección temporal:
function post_redirect($url) {
$_SESSION[''post_data''] = $_POST;
header(''Location: '' . $url);
}
Luego siempre verifique la variable de sesión post_data
:
if (isset($_SESSION[''post_data''])) {
$_POST = $_SESSION[''post_data''];
$_SERVER[''REQUEST_METHOD''] = ''POST'';
unset($_SESSION[''post_data'']);
}
Habrá algunos componentes faltantes, como apache_request_headers () no mostrará un encabezado de contenido POST, etc.
Sí, puedes hacer esto en PHP, por ejemplo, en
Silex o Symfony3
usando subrequest
$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);
Una publicación anterior, pero aquí es cómo lo manejé. Usando el método de 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);
}
}
Una solución que funciona perfectamente:
En la página de origen, comience a abrir una sesión y asigne tantos valores como desee. Luego haga la reubicación con "encabezado":
<!DOCTYPE html>
<html>
<head>
<?php
session_start();
$_SESSION[''val1''] = val1;
...
$_SESSION[''valn''] = valn;
header(''Location: http//Page-to-redirect-to'');
?>
</head>
</html>
Y luego, en la página de destino:
<!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>
No es necesario Javascript ni JQuery. ¡Buena suerte!
Use curl para esto. Google para "curl php post" y encontrarás esto: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html .
Tenga en cuenta que también puede usar una matriz para la opción CURLOPT_POSTFIELDS. De los documentos de php.net:
La información completa para publicar en una operación HTTP "POST". Para publicar un archivo, anteponga un nombre de archivo con @ y use la ruta completa. Esto se puede pasar como una cadena urlencoded como ''para1 = val1 & para2 = val2 & ...'' o como una matriz con el nombre del campo como clave y datos de campo como valor. Si value es una matriz, el encabezado Content-Type se establecerá en multipart / form-data.
Utilicé el siguiente código para capturar los datos POST que se enviaron desde form.php y luego concatenarlo en una URL para enviarlo de vuelta al formulario para correcciones de validación. Funciona como un amuleto y, de hecho, convierte datos POST en datos GET.
foreach($_POST as $key => $value) {
$urlArray[] = $key."=".$value;
}
$urlString = implode("&", $urlArray);
echo "Please <a href=''form.php?".$urlString."''>go back</a>";
Va a necesitar CURL para esa tarea, me temo. Una buena manera fácil de hacerlo aquí: http://davidwalsh.name/execute-http-post-php-curl
Espero que ayude
aquí está la muestra de solución.
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;
}
/**
* 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");
}
}