Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/08/2003, 11:27
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola,

Si deseas "hablar" con un servidor web mediante el método POST, sin intermediaros (es decir, formularios), tienes entonces que encargarte personalmente de crear la conexión TCP con el servidor, y enviar la información "cruda" de la petición HTTP correspondiente.

Esto quiere decir, abrir la conexión y enviar el flujo de cabeceras HTTP necesarias (más algunas otras que puedas querer), y a continuación (luego de dos saltos de línea consecutivos) el contenido de las variables que vas a pasar, codificadas del mismo modo en que se codifican las variables en el query de una conversación por el método GET.

Considera por ejemplo el siguiente segmento de código:

Código:
<?php

// Funcion que intenta enviar una serie da valores mediante el método
// POST a un documento web en particular. Recibe, en orden: (a) el
// nombre del servidor con el que se va a realizar la conexion (p.
// ej. 'www.servidor.com', o '127.0.0.1'), (b) la ruta hacia el
// documento web al que le van a ser pasados los valores
// (p. ej. '/cgi-bin/script.cgi') y (c) una matriz asociativa con los
// valores a pasar. Las claves de esta matriz seran usadas como
// nombres de variables y los valores como valores de cada variable.

// Esta funcion podria implementar mas chequeos, pero en terminos
// generales, suele devolver TRUE cuando la informacion es enviada
// exitosamente, y FALSE de lo contrario.

function enviar_metodo_post ($servidor, $ruta, $matriz)
{
    $contenido = '';

    $primer = true;  // Bandera que indica si se esta procesando la
                     // primera pareja clave/valor de la matriz
                     // recibida

    while (list ($clave, $valor) = each ($matriz)) {
        if (! $primer)
            $contenido .= '&';
        else 
            $primer = false;

        $contenido .= urlencode ($clave) . '=' . urlencode ($valor);
    }
    
    $socket = fsockopen ($servidor, 80);  // Conexion por el puerto 80

    if (!$socket) {
        trigger_error ('No fue posible abrir la conexion con el servidor');
        return false;
    }

    // Enviar cabeceras HTTP
    fwrite ($socket, "POST $ruta HTTP/1.0\n");
    fwrite ($socket, "Content-type: application/x-www-form-urlencoded\n");
    fwrite ($socket, "Content-length: " . strlen ($contenido) . "\n\n");

    // Enviar el contenido de las variables
    fwrite ($socket, $contenido);

    fclose ($socket);

    return true;
}


$variables = array ('nombre' => 'Pedro Perez', 'Telefono' => '12345678');

$resultado = enviar_metodo_post ('servidor_cualquiera.com',
                                 '/ruta/hacia/algun/documento.php',
                                 $variables);

if ($resultado)
    echo "Los valores fueron enviados mediante el metodo POST.\n";

?>
Espero que el código sea claro por sí solo. Quizás quieras jugar un poco con este ejemplo, alterando los valores de algunas variables (por ejemplo, el puerto de la conexión, si se necesitara), o modificando/agregando cabeceras HTTP.

Otro ejercicio interesante podría ser imprimir la información que es enviada al servidor, y la información que es recibida de vuelta, para efectos de depuración. En éste último caso, podrías recibir la información de respuesta del servidor remoto mediante llamados a funciones como fread(), usando la variable $socket como descriptor de archivo.

Un cordial saludo