Algunos ejemplos del uso de la extensión cURL de PHP
El uso de la extensión cURL de PHP nos brinda una manera conveniente de comunicarnos con otros sitios web, particularmente con las API proporcionadas por un tercero.
Trabajar del lado del servidor no implica necesariamente que toda la información requerida deba estar presente en la base de datos del sitio en el que estamos trabajando y por eso hoy os muestro unos ejemplos del uso de la extensión cURL de PHP.
De hecho, una parte cada vez mayor de la información que se utiliza en el lado del servidor proviene de fuentes externas, a menudo a través de una API que permite que algún tipo de servicio proporcione información al sitio web sin tener acceso a la base de datos en el sitio remoto.
Para utilizar esta información, podemos usar la extensión PHP incorporada cURL .
cURL es una extensión de PHP, que nos permite recibir y enviar información a través de la sintaxis de URL.
Al hacerlo, cURL facilita la comunicación entre diferentes sitios web y dominios.
Algunos usos comunes de cURL incluyen:
- Descargar el contenido de un sitio web
- Descargar un archivo de un sitio web
- Envío automático de formularios
- Autenticación
- Uso de cookies
¿Cómo funciona la extensión cURL?
La extrensión cURL de PHP funciona enviando una solicitud a un sitio web, y este proceso incluye las siguientes cuatro partes:
1. Inicialización.
$handle = curl_init();
2. Configuración de las opciones. Hay muchas opciones, por ejemplo, una opción que define la URL.
curl_setopt($handle, CURLOPT_URL, $url);
3. Ejecución con curl_exec() .
$data = curl_exec($handle);
4. Cerrar el controlador cURL.
curl_close($handle);
La segunda parte es la más interesante porque nos permite definir cómo funciona la extrensión cURL de PHP de una manera muy precisa, utilizando las múltiples opciones que ofrece.
1. ¿Cómo descargar el contenido de un sitio web remoto a un archivo local?
Para poder descargar los contenidos de un sitio web remoto, necesitamos definir las siguientes opciones:
CURLOPT_URL : define la URL remota.
CURLOPT_RETURNTRANSFER – Habilita la asignación de los datos que descargamos del sitio remoto a una variable.
En este ejemplo, asignamos los datos a la variable $output .
<?php $handle = curl_init(); $url = "https://www.the-scorpions.com"; // Set the url curl_setopt($handle, CURLOPT_URL, $url); // Set the result output to be a string. curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($handle); curl_close($handle); echo $output;
Cuando imprimamos el valor de la variable $output en la pantalla, veremos la versión local del sitio web del grupo musical Scorpions.
En cualquier caso, las opciones se pueden escribir de manera más compacta usando curl_setopt_array() , que es una función cURL que reúne las opciones en una matriz.
curl_setopt_array($handle, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true ) );
2. ¿Cómo descargar un archivo desde un sitio remoto usando cURL?
Se puede descargar un archivo remoto a nuestro servidor, si se establece la opción CURLOPT_ FILE .
Por ejemplo, el siguiente código descarga el libro «Don Quijote de La Mancha» del Proyecto Gutenberg en un archivo don_quijote_de_la_mancha.html en nuestro servidor:
<?php // The distant site url. $url = "https://www.gutenberg.org/files/2000/2000-h/2000-h.htm"; // The file on our server. $file = __DIR__ . DIRECTORY_SEPARATOR . "don_quijote_de_la_mancha.html"; $handle = curl_init(); // Open the file on our server for writing. $fileHandle = fopen($file, "w"); curl_setopt_array($handle, array( CURLOPT_URL => $url, CURLOPT_FILE => $fileHandle, ) ); $data = curl_exec($handle); curl_close($handle); fclose($fileHandle);
Manejando de la respuesta devuelta
Para obtener los parámetros de la respuesta para que sea monitoreada y depurada, debemos configurar la opción CURLOPT_HEADER .
Siguiendo en el ejemplo anterior:
<?php $url = "https://www.gutenberg.org/files/2000/2000-h/2000-h.htm"; $file = __DIR__ . DIRECTORY_SEPARATOR . "don_quijote_de_la_mancha.html"; $handle = curl_init(); $fileHandle = fopen($file, "w"); curl_setopt_array($handle, array( CURLOPT_URL => $url, CURLOPT_FILE => $fileHandle, CURLOPT_HEADER => true ) ); $data = curl_exec($handle);
Para obtener información adicional sobre la solicitud, usamos el comando curl_getinfo que nos permite recibir información técnica importante sobre la respuesta, incluido el código de estado (200 para el éxito) y el tamaño del archivo descargado.
$responseCode = curl_getinfo($handle, CURLINFO_HTTP_CODE ); $downloadLength = curl_getinfo($handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD );
Además, también podemos usar los comandos: curl_error y curl_errno para depurar la respuesta y recibir mensajes de error informativos.
if(curl_errno($handle)) { print curl_error($handle); }
Con todo esto, el código completo quedaría así:
<?php $url = "https://www.gutenberg.org/files/2000/2000-h/2000-h.htm"; $file = __DIR__ . DIRECTORY_SEPARATOR . "don_quijote_de_la_mancha.html"; $handle = curl_init(); $fileHandle = fopen($file, "w"); curl_setopt_array($handle, array( CURLOPT_URL => $url, CURLOPT_FILE => $fileHandle, CURLOPT_HEADER => true ) ); $data = curl_exec($handle); $responseCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); $downloadLength = curl_getinfo($handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD); if(curl_errno($handle)) { print curl_error($handle); } else { if($responseCode == "200") echo "successful request"; echo " # download length : " . $downloadLength; curl_close($handle); fclose($fileHandle); }
3. ¿Cómo enviar formularios con cURL?
Hasta este momento, hemos demostrado el uso del método GET de HTTP (que generalmente se usa para ver y descargar contenido).
cURL también puede hacer uso del método POST de HTTP para enviar formularios.
Para demostrar el envío de formularios con cURL, necesitamos crear los siguientes dos archivos:
- index.php en el que ponemos el script cURL.
- form.php en el que ponemos el formulario a enviar.
El form.php se encontrará en realidad en un servidor remoto (aunque, por el bien del ejemplo, ambos archivos pueden estar ubicados en el mismo servidor).
Para este ejemplo usaremos un formulario con 3 campos: nombre, apellido y enviar.
<?php if(isset($_POST["submit"])) { echo "Full name is " . $_POST["firstName"] . " " . $_POST["lastName"]; exit; } ?> <html> <body> <form method = "POST" action = "" > <input name="firstName" type="text"> <input name="lastName" type="text"> <input type="submit" name="submit" value="שלח" > </form> </body> </html>
Para enviar el formulario, se deben configurar las siguientes opciones:
- CURLOPT_POST : configura la solicitud para que esté en un modo de publicación.
- CURLOPT_POSTFIELDS – Recibe el array asociativo de los campos que queremos postear. Las claves de matriz se nombran según el nombre de los campos del formulario.
<?php $handle = curl_init(); $url = "https://localhost/curl/theForm.php"; // Matriz con los nombres y valores de los campos. // Los nombres de campo deben coincidir con los nombres de campo en el formulario. $postData = array( 'firstName' => 'Lady', 'lastName' => 'Gaga', 'submit' => 'ok' ); curl_setopt_array($handle, array( CURLOPT_URL => $url, // Habilita la respuesta POST. CURLOPT_POST => true, // Los datos a transferir con la respuesta. CURLOPT_POSTFIELDS => $postData, CURLOPT_RETURNTRANSFER => true, ) ); $data = curl_exec($handle); curl_close($handle); echo $data;
4. ¿Cómo realizar la autenticación HTTP básica con cURL?
Para autenticarse con cURL, se deben configurar las siguientes 3 opciones:
- CURLOPT_HTTPAUTH
- CURLOPT_USERPWD – A través del cual definimos el usuario y contraseña.
- CURLOPT_RETURNTRANSFER
El código quedaría así:
curl_setopt_array($handle, array( CURLOPT_URL => $url, CURLOPT_HTTPAUTH => CURLAUTH_ANY, CURLOPT_USERPWD => "$username:$password", CURLOPT_RETURNTRANSFER => true, ) );
5. ¿Cómo manejar las cookies con cURL?
El uso de cookies permite que un sitio web identifique a los visitantes que regresan y a los usuarios autenticados. Para ello, cURL nos proporciona un mecanismo a través del cual podemos guardar cookies.
Las dos opciones principales que nos permiten manejar las cookies son:
- CURLOPT_COOKIEJAR : define el archivo necesario para escribir las cookies.
- CURLOPT_COOKIEFILE : define el archivo desde el que se leerán las cookies.
El siguiente ejemplo de código escribe las cookies en un archivo cookie.txt en la primera visita y luego lee los datos en visitas posteriores.
<?php $handle = curl_init(); $url = "https://www.the-scorpions.com/tour/"; $file = __DIR__ . DIRECTORY_SEPARATOR . "cookie.txt"; curl_setopt_array($handle, array( CURLOPT_URL => $url, // El archivo en el que se deben escribir las cookies. CURLOPT_COOKIEFILE => $file, // El archivo del que se deben leer las cookies. CURLOPT_COOKIEJAR => $file, CURLOPT_RETURNTRANSFER => true, ) ); $data = curl_exec($handle); curl_close($handle);
Conclusión
El uso de la extensión cURL de PHP nos brinda una manera conveniente de comunicarnos con otros sitios web, particularmente con las API proporcionadas por un tercero.
Vereis que, como programadores, debereis utilizar muchas veces esta extensión para conectaros a servicios y bases de datos de terceros.
Espero que os haya sido de utilidad.