Estoy usando curl
en la línea de comandos en Linux para emitir peticiones HTTP. Los cuerpos de las respuestas se imprimen en la salida estándar, lo cual está bien, pero no puedo ver en la página de manual cómo hacer que curl imprima el código de estado HTTP de la respuesta (404, 403, etc.). ¿Es esto posible?
Respuestas
¿Demasiados anuncios?Una forma más específica de imprimir sólo el código de estado HTTP es algo parecido a
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
Es mucho más fácil trabajar con scripts, ya que no requiere ningún análisis sintáctico :-)
El parámetro -I
podría añadirse para mejorar el rendimiento de la carga de respuesta. Esto cambiará la llamada a un HEAD
que recuperará sólo los datos generales de la respuesta, sin el cuerpo.
Nota: %{http_code}
devuelve en la primera línea de la carga útil HTTP
es decir:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
Si quiere ver la cabecera así como el resultado, puede utilizar la opción verbosa:
curl -v http://www.example.org
curl --verbose http://www.example.org
El estado aparecerá en la cabecera. Por ejemplo
< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity
Si quieres capturar el código de estado HTTP en una variable, pero seguir redirigiendo el contenido a STDOUT, debes crear dos STDOUT. Puede hacerlo con sustitución del proceso >() y sustitución de comandos $() .
En primer lugar, cree un descriptor de archivo 3
para el STDOUT de su proceso actual con exec 3>&1
.
A continuación, utilice la función -o
para redirigir el contenido de la respuesta a un fifo temporal utilizando la sustitución de comandos, y luego dentro de esa sustitución de comandos, redirigir la salida de vuelta a su proceso actual descriptor de archivo STDOUT 3
con -o >(cat >&3)
.
Poniendo todo junto en bash
3.2.57(1)-release
(estándar para macOS
):
# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')
Tenga en cuenta que esto no funciona en /bin/sh
como SamK señaló en los comentarios .
- Ver respuestas anteriores
- Ver más respuestas