Pregunta ¿Hacer curl para dar salida al código de estado HTTP?


Estoy usando curl en la línea de comando en Linux para emitir solicitudes HTTP. Los cuerpos de respuesta están impresos en una salida estándar, lo cual está bien, pero no puedo ver desde la página del manual cómo hacer que Curl imprima el código de estado HTTP de la respuesta (404, 403, etc.). es posible?


559


origen


En cuanto a mí, puedo ver en el manual cómo obtener el código de estado HTTP, pero la opción -w no funciona. He informado el error a Apple. - Nicolas Barbulesco
los -i bandera, como en curl -i https://www.example.com/, es probablemente lo que quieres, según superuser.com/a/514798/190188 - caw


Respuestas:


Esto debería funcionar para ti Si el servidor web puede responder a las solicitudes HEAD (esto no llevará a cabo GET)

curl -I http://www.example.org

Como una adición, para permitir que cURL siga redirecciones (estados 3xx) agregue -L.


350



NÓTESE BIEN: curl -I hace una solicitud HEAD HTTP, que puede ser problemática para probar el código de estado HTTP para algunos servidores y servicios de aplicaciones web - Jay Taylor
Y para obtener solo el número de estado, dirígelo a head -n 1|cut -d$' ' -f2 - Benubird
No te olvides de redireccionar el stderr de curl: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Agregue -L a curl si necesita el estado final luego de los redireccionamientos. - Aaron Blenkush
Seguir el redireccionamiento después de solo hacer una solicitud HEAD puede causar un comportamiento interesante, dependiendo de cómo esté programada la aplicación. - Scott McIntyre
curl -I -X GET enviará una solicitud GET, pero dará el mismo resultado. - jiggy


Una forma más específica de imprimir sólo el código de estado HTTP es algo así como:

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 :-)

El parámetro -I podría agregarse para mejorar el rendimiento de la carga de respuesta. Este parámetro solo solicita el estado / encabezados de respuesta, sin cuerpo de respuesta de descarga. (% {http_code} regresa 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/

625



-w "% {http_code}" es el bit que imprime el código de estado. Puede agregar una nueva línea o dos para separar el código del cuerpo (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Wow, esto /dev/null Lo que funciona incluso en la versión de Windows de curl que estoy usando. - Uwe Keim
Creo que esto descarga todo el archivo, aunque todo va a / dev / null, por lo que no es ideal para verificar el código de estado de los archivos de gran tamaño. httping -c 1 -s -G -m emite un GET y no descarga todo el archivo, aunque me doy cuenta de que esta pregunta es específicamente sobre curl. - RomanSt
@romkyns, tiene razón: la primera variante de mi respuesta descarga todo el archivo y lo "guarda" en /dev/null, pero la segunda variante, es decir. el que usa el -I opción para curl - no. Sin embargo, se debe tener cuidado, ya que en realidad no se está probando la misma acción: se hace un HTTP GET solicitud, mientras que el otro hace una HEAD solicitar ... algunos servidores web / sitios web responderán con un código de estado diferente, ¡incluso si la URL solicitada es exactamente la misma! - pvandenberk
FYI: -s = No mostrar el progreso de la descarga, -o /dev/null = no muestra el cuerpo, -w "%{http_code}" = Escribe el código de respuesta http para stdout después de la salida. - Ajedi32


Si desea ver el encabezado y el resultado, puede usar la opción detallada:

curl -v http://www.example.org
curl --verbose http://www.example.org

El estado aparecerá en el encabezado. P.ej.

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

171



+1 para señalar el indicador detallado proporciona los detalles adicionales. Ideal para probar aplicaciones REST. - MrOodles
+1 muy fácil de usar cuando se realiza la solicitud POST (curl -v --data "...") - MegaTux
Incluso los divide en dos salidas de archivo diferentes (detalles de estado http a stderr y cuerpo de respuesta a stdout) - Blauhirn


Puede imprimir el código de estado, además de todos los encabezados, haciendo lo siguiente:

curl -i http://example.org

Lo bueno de -i es que funciona con -X POST también.


142



Mucho mejor que la respuesta aceptada (que hace una solicitud HEAD). - neu242
Quizás sea obvio, pero -i funciona con alguna Método HTTP, no solo GET y POST... :) - mac
la mejor respuesta ya que hace que Curl produzca tanto encabezados como cuerpo, lo que lo hace adecuado para la mayoría de las tareas cuando se usa en un script - Sarge Borsch
Esta es la mejor respuesta, y se puede usar junto con -s (no muestre el medidor de progreso o mensajes de error) y -S(muestra mensajes de error después de todo) - Jonathan Hartley


Si desea capturar el código de estado HTTP en una variable, pero aún así redirigir el contenido a STDOUT, debe crear dos STDOUT. Puedes hacerlo con sustitución de procesos> () y sustitución de comando $ ().

Primero, crea un descriptor de archivo 3 para su proceso actual 'STDOUT con exec 3>&1.

Entonces, usa Curl's -o opción para redirigir el contenido de la respuesta a una fifo temporal usando la sustitución de comando, y luego dentro de esa sustitución de comando, redirigir la salida de regreso a su proceso actual Descriptor de archivo STDOUT 3 con -o >(cat >&3).

Poniendolo todo junto:

#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')

45



Eso es una gran manía ... ¡y me gusta! - spyle
¿Ahora cómo, a su vez, puedo redirigir la salida a otra variable? - Roger Filmyer
La salida está en STDOUT, por lo que debería poder redirigir la salida del comando a cualquier lugar que desee, al igual que un comando normal. No he probado esto sin embargo. - Heath Borders


Redefina la salida de curl

curl -sw '%{http_code}' http://example.org

Se puede usar con cualquier tipo de solicitud.


26



-k (--insecure) está anulando -s (silencioso). - Ravichandra


Esto enviará una solicitud a la url, solo obtendrá la primera línea de la respuesta, dividirla en bloques y seleccionar la segunda.

Contiene el código de respuesta

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10



¿Puede explicar lo que hace este código y cómo aborda el problema dado por el OP? El código inexplicado puede parecer no confiable y peligroso para los usuarios. - bwDraco
Claro, enviamos una solicitud a la url, obtenemos solo la primera línea de la respuesta, la dividimos en bloques y seleccionamos la segunda. Contiene el código de respuesta que OP está buscando. - Filip Spiridonov


Para una solicitud POST, lo siguiente funcionó:

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

8