Seguramente que alguna vez te has encontrado en la tesitura de tener que conectar contra algún servicio ya sea FTP, SFTP, HTTP o incluso LDAP y no tenías el cliente apropiado instalado.
Todas estas acciones las podemos realizar con cURL pero, ¿qué es cURL realmente y cómo puede ayudarnos?
Qué es cURL
cURL es la abreviatura de “Client URL” y es una herramienta de línea de comandos utilizada para la transferencia de ficheros con formato URL. Soporta multitud de protocolos entre los que se encuentran FTP, SFTP, SCP, LDAP y por supuesto HTTP y HTTPS, y está formado por dos partes; la librería libcurl y el intérprete curl.
En este artículo nos centraremos en el uso de cURL para los protocolos HTTP y HTTPS.
Para poder seguir el blog de forma correcta primero debemos conocer qué es el protocolo HTTP y cómo funcionan las cabeceras HTTP. Si aún no lo sabes, puedes echarle un vistazo a este post que tenemos sobre ello.
Como hemos comentado anteriormente, cURL es una herramienta de línea de comandos. Aunque cURL es utilizado por multitud de programas y está presente en la mayoría de SO primero tenemos que comprobar si cURL está instalado en nuestro sistema. A lo largo del post utilizamos Linux como sistema operativo de referencia para todas las pruebas, pero tú puedes instalar cURL en tu sistema operativo favorito.
Una vez tengamos instalado cURL, vamos a realizar nuestra primera petición HTTP.
La sintaxis de cURL se forma de la siguiente manera:
Usage: curl [options…] <url>
Por lo que para realizar una simple petición GET podemos ejecutar lo siguiente:
curl https://www.makingscience.com/ |
Seguramente ahora mismo verás tu terminal inundado de código HTML y JavaScript ¿por qué ocurre esto? Este código es la respuesta que nos ha dado www.makingscience.com a nuestra petición. Es la página completa que veríamos al visitar www.makingscience.com desde nuestro navegador.
cURL actúa como un “navegador” desde la terminal, por lo que todo el contenido del cuerpo de nuestra petición, va a ser mostrado por la terminal.
En multitud de ocasiones el contenido del cuerpo de la respuesta no lo necesitamos ya que solo queremos comprobar el estado de nuestra petición o la información de las cabeceras. Para poder hacer una petición sin recibir todo el contenido podemos utilizar la opción “-I” en nuestra petición cURL. De este modo realizaremos una petición de tipo “HEAD” para recibir únicamente la información de las cabeceras.
curl -I https://www.makingscience.com HTTP/2 200 server: nginx date: Wed, 18 May 2022 14:24:25 GMT content-type: text/html; charset=UTF-8 vary: Accept-Encoding link: <https://www.makingscience.com/wp-json/>; rel=»https://api.w.org/» link: <https://www.makingscience.com/wp-json/wp/v2/pages/11001>; rel=»alternate»; type=»application/json» link: <https://www.makingscience.com/>; rel=shortlink access-control-allow-origin: * … |
En esta ocasión podemos ver que sólo nos está mostrando el código de respuesta del servidor y las cabeceras que nos devuelve www.makingscience.com.
Ejemplos básicos de cURL
Dado que ya tenemos una breve introducción de qué es y cómo funciona cURL, vamos a ir explicando algunos ejemplos básicos y de gran utilidad para los que podamos usar cURL.
- Guardar salida a fichero
Podemos utilizar las opciones -o y -O para guardar la respuesta en un fichero ¿cuál es la diferencia entre -o y -O? Con la o minúscula podemos especificar el fichero específico donde queramos guardar la respuesta y con la O mayúscula nos guardará el fichero con el nombre que tiene el recurso pedido.
curl -o index.html https://www.makingscience.com/ |
curl -O https://www.makingscience.com/wp-content/themes/fundaciontheme/fonts/graphik/ttf/Graphik-Regular.ttf |
En el primer caso, nos guardará el recurso pedido como index.html. En el segundo ejemplo, nos guardará el fichero Graphik-Regular.ttf con el mismo nombre.
Esta opción también nos sirve para enviar la respuesta que no queramos a cualquier sitio, por ejemplo, a /dev/null.
- Seguir redirecciones
Con la opción –location o -L podemos seguir las redirecciones que haga nuestra petición. Si realizamos una petición y el código de respuesta es un 30X, esto quiere decir que no es el destino final de nuestra petición, si no que el servidor nos está redirigiendo a otro sitio. cURL por defecto no sigue esa redirección, si no que nos devuelve ese código y finaliza la ejecución.
curl -I https://makingscience.com/
|
Como vemos en el ejemplo anterior, el servidor devuelve un 301 ya que realiza una petición a la URL con www. En el caso de hacer la misma petición pero con la opción -L, podemos ver que cURL sigue la redirección y nos muestra el resultado final con las dos respuesta.
curl -IL https://makingscience.com/
… |
- Uso de otros métodos HTTP
Al principio del post, explicamos cómo realizar peticiones para ver sólo las cabeceras de la petición, esta opción es posible ya que cURL realiza una petición de tipo HEAD en lugar de un GET cuando utilizamos el parámetro -I pero ¿cómo podemos hacer peticiones con otros métodos HTTP? Para hacer peticiones con otros métodos, podemos utilizar la opción -X seguido del método que queramos.
curl -X OPTIONS https://www.makingscience.com/ curl -X POST https://www.makingscience.com/ |
- Añadir cabeceras HTTP
Acabamos de aprender cómo cambiar el método de nuestra petición en cURL. Muchas veces vamos a querer añadir cabeceras extra, por ejemplo, si queremos hacer una subida a través de POST a un API. Para añadir cabeceras con cURL tenemos que indicarle la opción -H seguido de la cabecera que queramos establecer:
curl -X POST -H «Content-Type: application/json» «https://www.example.com» |
Podemos incluir más de una cabecera añadiendo más opciones con -H
curl -X POST -H «Content-Type: application/json» -H «Accept: application/json» «https://www.example.com» |
Conclusión
Aunque cURL no es la herramienta más intuitiva para realizar peticiones HTTP como podría ser Postman, Insomnia o alguna otra con GUI, si que nos permite una flexibilidad y configuración mayor. Podemos ejecutar cURL prácticamente desde cualquier parte y adaptar la herramientas a nuestros scripts, recuerda que cURL no solo soporta HTTP si no que la lista de protocolos soportados es mucho más amplia.