lunes, 21 de julio de 2014

Enviar Variables POST desde PHP con cURL sin usar formularios


Hoy veremos como enviar variables del tipo GET desde un sitio remoto, sin contar con un Formulario clásico de HTML <FORM>. Es decir, que emularemos el comportamiento de un formulario HTML y enviaremos variables del tipo POST a un servidor o dominio específico.

Hay múltiples razones por las que podemos necesitar hacer algo así, y contar con esta alternativa y saber de su existencia puede sernos útil a la hora de tomar decisiones para resolver problemas concretos. En principio, lo más común es que necesitemos enviar informarción desde un sitio alojado en un servidor a otro alojado en otro servidor y queremos evitar el uso de variables GET que nos obliguen a develar información o a tener que encriptarla para su envío.
En nuestro caso, teníamos un formulario de contacto clásico en un sitio web, y necesitábamos que esa misma información se impactara en un servicio alojado en un servidor diferente, en otro dominio, sobre una estructura completamente diferente, y de alguna forma requeríamos actualizar ambos sistemas de forma sincronizada. La razón por la que usamos este método es porque el sistema destino ofrece una forma estandarizada de añadir más información a su base de datos, que utiliza un formulario HTML propio de la aplicación, y es el mejor método y más seguro, que evita además entrometerse en la Base de Datos por detrás del sistema propiamente dicho y correr el riesgo de corromper su estructura.

Para alcanzar este objetivo, utilizamos una extensión de PHP denominada cURL. Esta extensión nos permite establecer sockets de conexión de varios de tipos: FTP, SFTP, HTTP, HTTPS, etc. De este modo, lo utilizaremos para enviar nuestras variables POST a un servicio alojado en un servidor externo.



En primer lugar, debemos averigüar si la extensión cURL está instalada y activa en nuestro servicio. Existen múltiples formas de saberlo, pero quizás la más rápida sea iniciar nuestro script con un bucle IF para determinar si nos retorna o no un valor FALSE.

Para establecer una conexión utilizamos la función curl_init(). Utilizaremos una variable ($curl_connection) para hacer seguimiento de nuestra conexión
De este modo, podemos escribir:
 if($curlconnection = curl_init('http://miservidor.com'))  
   {  
     //nuestra conexion es satifactoria  
   }else{  
     // nuestra conexion falla porque cURL no está instalado y/o activado en nuestro host  
   }  

Una vez que sabemos que cURL está presente en nuestro host, proseguimos a setear las variables de conexión más comunes con la función curl_setopt().

 if($curl_connection = curl_init('http://miservidor.com'))  
       {  
         curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);  
         curl_setopt($curl_connection, CURLOPT_USERAGENT,  
         "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");  
         curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);  
         curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);  
         curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);  
 ...}else{  
     // nuestra conexion falla porque cURL no está instalado y/o activado en nuestro host  
   }  

La primera de ellas setea un tiempo de espera máximo de 30 segundos para nuestro script. De esta forma, en aquellos casos en los que exceda este tiempo de espera, el proceso se detiene automáticamente y cancela todas las operaciones pendientes.
La segunda opción se utiliza para "declararse" al servidor externo como un "navegador corriente". En este caso, utilizamos una opción general como es "Mozilla/4.0..."
El resto de las opciones son variables generales que, para este tipo de conexión en que no vamos a usar conexiones seguras del tipo HTTPS ni certificados SSL, las seteamos de esa forma.
Si quieres saber más en detalles acerca de estas opciones, puedes visitar PHP.NET en donde encontrarás la lista completa de variables posibles y más detalles sobre cada una de ellas.

El siguiente paso es el más importante, ya que en él seteamos todas las variables que necesitemos enviar a nuestro servidor externo. La forma de hacerlo es utilizando un array que llamaremos $post_data[]. La sintaxis es la siguiente: $post_data['nombre_variable'] = 'atributo'.

Por ejemplo:

 $post_data['email'] = 'info@woopi.com.ar';  
 $post_data['telefono'] = '123546';  
....

Una vez que tenemos todos los valores que necesitamos enviar, con los valores correspondientes y los nombres de las variables bien seteados (esto es importante porque el formulario destino "espera" recibir una cierta cantidad de variables, con un nombre determinado), proseguimos a escribir una funcion que se encargará de recorrer y reagruparlas en un nuevo array. Además, utilizaremos la función implode() para "unir" todos los strings en uno sólo mediante el signo "&".
Quedaría algo así:

     foreach ( $post_data as $key => $value)  
     {  
       $post_items[] = $key . '=' . $value;  
     }  
     $post_string = implode ('&', $post_items);     

Ya tenemos todo listo para enviar en nuestra variables $post_string. Por consiguiente, necesitamos
decirle a cURL cuáles son las cadenas de texto vamos a enviar, y qué tipo de variables serán (en este caso, variables POST):

  curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);  

Ahora sí, ejecutamos nuestro envío:

 $result = curl_exec($curl_connection);  

Si llegáramos a necesitar ver algunos resultados de nuestro script, porque surgió un error, o queremos chequear algo en particular, podemos imprimir en pantalla los resultados de nuestra conexión de la siguiente manera. En caso de no necesitarlo, podemos comentarlos.


     print_r(curl_getinfo($curl_connection));  
     echo curl_errno($curl_connection) . '-' .  
     curl_error($curl_connection);  

Por prolijidad y seguridad, cerramos la conexión una vez terminada nuestra tarea:

  curl_close($curl_connection);  

Y listo!
Hemos enviado nuestras variables POST a un servidor externo sin haber utilizado un Formulario HTML.

Les dejamos el script completo para que lo copien y editen directamente desde ahí.
Hasta la próxima!!

 <?php  
 function enviar_curl(){  
     if($curl_connection = curl_init('http://miservidor.com'))  
       {  
         curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);  
         curl_setopt($curl_connection, CURLOPT_USERAGENT,  
         "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");  
         curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);  
         curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);  
         curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);  
       /* Setea las variables necesarias para suscribir la info a la base */    
     $post_data['email'] = 'info@woopi.com.ar';  
     // agrega todas las que sean necesarias  
     /*  Recorremos el array y conformamos una array nuevo para hacer el envio, con el formato correspondiente */  
     foreach ( $post_data as $key => $value)  
     {  
       $post_items[] = $key . '=' . $value;  
     }  
     $post_string = implode ('&', $post_items);    
     /* Seteamos las variables que vamos a enviar y el tipo*/  
     curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);  
     //ejecuta el envio  
     $result = curl_exec($curl_connection);  
     //muestra los resultados del proceso  
     //print_r(curl_getinfo($curl_connection));  
     //echo curl_errno($curl_connection) . '-' .  
             //curl_error($curl_connection);  
     //cierra la conexión  
     curl_close($curl_connection);  
       }  
     else{//echo 'Failed the cURL Initialization. Check that you have de cURL Extension installed and activated; or contact our technical support at Woopi: http://www.woopi.com.ar';  
     }  
 }  
 enviar_curl();  
  ?>  

2 comentarios :

  1. Mejor opción de hosting, alojamiento web Linux o Windows y dominios. ... Housing Tu server en dh · Resellers Gana con DH; Más Servicios Para tu proyecto. Web Hosting en México

    ResponderEliminar
    Respuestas
    1. Elizabeth J. Neal, poner publicidad de esta forma es de ser muy mediocre. supongo que ya te lo habrá dicho otras veces pero no esta de mas que te lo repita.
      y el post esta genial..... gracias por compartirlo con tus seguidores realgen

      Eliminar