Cómo mostrar encabezados de solicitud con línea de comando curl
568
La línea de comando curl puede mostrar el encabezado de respuesta usando la -Dopción, pero quiero ver qué encabezado de solicitud está enviando. ¿Cómo puedo hacer eso?
curl --head http://google.comhará lo mismo que la -Ibandera :)
Abel Terefe
99
Nota sobre el uso de --head/ -I: no todos los servidores responden exactamente igual a las HEADsolicitudes (por ejemplo, Content-Encodingfaltaría si intentara verificar que el cuerpo se comprimiría) y no todos los servidores son compatibles HEAD. -vsuele ser la opción más segura.
Lea la pregunta: esto es para encabezados de respuesta, no para encabezados de solicitud
Graeme Stuart
58
Esta respuesta me es útil porque también leí mal la pregunta.
Liam
2
Este comando es un poco diferente para Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov En realidad, el equivalente de /dev/nullen Windows nulno lo es null.
Francisco Zarabozo
2
Aunque esta pregunta solicita encabezados de solicitud, Google está dirigiendo a todos los que están buscando encabezados de respuesta, por lo que todos estamos contentos de que esta respuesta esté aquí. Y esta respuesta es la mejor para obtener encabezados de respuesta. ¡¡¡Gracias!!!
biomiker
96
Creo que el cambio de línea de comando que está buscando pasar a curl es -I.
Además, si encuentra un código de estado HTTP de respuesta de 301, es posible que también desee pasar un -Lcambio de argumento para indicar curlque siga las redirecciones de URL y, en este caso, imprima los encabezados de todas las páginas (incluidas las redirecciones de URL), como se ilustra a continuación :
La -Iopción muestra los encabezados de respuesta . La pregunta era sobre los encabezados de solicitud .
Asaph
53
Las -Iopciones hacen que curl haga un HTTP HEAD, lo que podría cambiar la respuesta del servidor. Mejor usar el -vinterruptor, creo.
acw
1
Si intenta esto con algo más que una HEADsolicitud (como -X POST) y obtiene "¡Solo puede seleccionar una solicitud HTTP!" que stackoverflow.com/questions/286982/… probablemente te ayudará. El caso es que -Ihace una HEADpetición, como acwse indica y cuando el curlestablecimiento de llamada a hacer otra llamada que tener dos peticiones HTTP en curlla llamada ...
la gripe
77
Esta es una respuesta muy incorrecta. (Prometo que generalmente soy muy amable aquí). 1. Hace lo contrario de lo que pide el OP. 2. Utiliza un método de solicitud de en HEADlugar de GETo POST. 3. NUNCA debe usarse para "solo ver los encabezados" a menos que esté tratando de ver cómo su servidor responde de manera diferente a a HEADen lugar de a GET. Será lo mismo la mayor parte del tiempo, pero no siempre. Para ver solo el uso de encabezados curl -o /dev/null -D /dev/stdout. Eso dará los resultados esperados el 100% del tiempo.
Bruno Bronosky
79
La opción detallada es útil, pero si desea ver todo lo que hace curl (incluido el cuerpo HTTP que se transmite, y no solo los encabezados), sugiero usar una de las siguientes opciones:
¡No lo creo, ya que también muestra los encabezados de respuesta y el cuerpo!
Pmpr
56
Obtiene una buena salida de encabezado con el siguiente comando:
curl -L -v -s -o /dev/null google.de
-L, --location seguir redireccionamientos
-v, --verbose más salida, indica la dirección
-s, --silent no mostrar una barra de progreso
-o, --output /dev/null no mostrar el cuerpo recibido
O la versión más corta:
curl -Lvso /dev/null google.de
Resultados en:
*Rebuilt URL to: google.de/*Trying2a00:1450:4008:802::2003...*Connected to google.de (2a00:1450:4008:802::2003) port 80(#0)> GET / HTTP/1.1>Host: google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1301MovedPermanently<Location: http://www.google.de/<Content-Type: text/html; charset=UTF-8<Date:Fri,12Aug201615:45:36 GMT
<Expires:Sun,11Sep201615:45:36 GMT
<Cache-Control: public, max-age=2592000<Server: gws
<Content-Length:218< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<*Ignoring the response-body
{[218 bytes data]*Connection#0 to host google.de left intact*Issue another request to this URL:'http://www.google.de/'*Trying2a00:1450:4008:800::2003...*Connected to www.google.de (2a00:1450:4008:800::2003) port 80(#1)> GET / HTTP/1.1>Host: www.google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1200 OK
<Date:Fri,12Aug201615:45:36 GMT
<Expires:-1<Cache-Control: private, max-age=0<Content-Type: text/html; charset=ISO-8859-1< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."<Server: gws
< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat,11-Feb-201715:45:36 GMT; path=/; domain=.google.de;HttpOnly<Accept-Ranges: none
<Vary:Accept-Encoding<Transfer-Encoding: chunked
<{[11080 bytes data]*Connection#1 to host www.google.de left intact
Como puede ver, curlgenera tanto los encabezados salientes como los entrantes y omite los datos del cuerpo, aunque le dice cuán grande es el cuerpo.
Además, para cada línea se indica la dirección para que sea fácil de leer. Me pareció particularmente útil rastrear largas cadenas de redireccionamientos.
Me gusta más que la -vopción con más votos. Además, solo por brevedad, esto también puede ser curl -Lvso /dev/null <target>tan largo como oel final.
chillido
12
Un comando como el siguiente mostrará tres secciones: encabezados de solicitud, encabezados de respuesta y datos (separados por CRLF). Evita la información técnica y el ruido sintáctico agregado por curl.
Tuve que superar este problema yo mismo al depurar aplicaciones web. -ves genial, pero demasiado detallado para mis gustos. Esta es la solución (solo bash) que se me ocurrió:
curl -v http://example.com/ 2> >(sed '/^*/d')
Esto funciona porque la salida de -vse envía a stderr, no a stdout. Al redirigir esto a una subshell, podemos sedeliminar líneas que comienzan con *. Como la salida real no pasa a través de la subshell, no se ve afectada. Usar una subshell es un poco difícil, pero es la forma más fácil de redirigir stderr a otro comando. (Como señalé, solo estoy usando esto para probar, por lo que funciona bien para mí).
la opción -v para curl es demasiado detallada en la salida de error que contiene el inicio *(línea de estado) o >(campo de encabezado de solicitud) o <(campo de encabezado de respuesta). para obtener solo el campo de encabezado de solicitud:
Para filtrar la -vsalida, debe dirigir la salida de error al terminal y la salida estándar a / dev / null, la opción -s es prohibir la medición del progreso
Si desea más alternativas, puede intentar instalar un cliente HTTP moderno de línea de comandos como httpie que está disponible para la mayoría de los sistemas operativos con gestores de paquetes como brew, apt-get, pip, yum, etc.
por ejemplo: - Para OSX
brew install httpie
Luego puede usarlo en la línea de comandos con varias opciones
curl --head http://google.com
hará lo mismo que la-I
bandera :)--head
/-I
: no todos los servidores responden exactamente igual a lasHEAD
solicitudes (por ejemplo,Content-Encoding
faltaría si intentara verificar que el cuerpo se comprimiría) y no todos los servidores son compatiblesHEAD
.-v
suele ser la opción más segura.Respuestas:
curl's
-v
u--verbose
option muestra los encabezados de solicitud HTTP, entre otras cosas. Aquí hay algunos resultados de muestra:fuente
Una respuesta popular para mostrar encabezados de respuesta , pero OP preguntó sobre encabezados de solicitud .
-s
: Evite mostrar la barra de progreso-D -
: Volcar encabezados en un archivo, pero lo-
envía a stdout-o /dev/null
: Ignorar cuerpo de respuestaEsto es mejor que
-I
ya que no envía unaHEAD
solicitud, que puede producir resultados diferentes.Es mejor que
-v
porque no necesitas tantos trucos para desvelarlo.fuente
curl -sD - -o NULL http://example.com
/dev/null
en Windowsnul
no lo esnull
.Creo que el cambio de línea de comando que está buscando pasar a curl es
-I
.Ejemplo de uso:
Además, si encuentra un código de estado HTTP de respuesta de 301, es posible que también desee pasar un
-L
cambio de argumento para indicarcurl
que siga las redirecciones de URL y, en este caso, imprima los encabezados de todas las páginas (incluidas las redirecciones de URL), como se ilustra a continuación :fuente
-I
opción muestra los encabezados de respuesta . La pregunta era sobre los encabezados de solicitud .-I
opciones hacen que curl haga unHTTP HEAD
, lo que podría cambiar la respuesta del servidor. Mejor usar el-v
interruptor, creo.HEAD
solicitud (como-X POST
) y obtiene "¡Solo puede seleccionar una solicitud HTTP!" que stackoverflow.com/questions/286982/… probablemente te ayudará. El caso es que-I
hace unaHEAD
petición, comoacw
se indica y cuando elcurl
establecimiento de llamada a hacer otra llamada que tener dos peticiones HTTP encurl
la llamada ...HEAD
lugar deGET
oPOST
. 3. NUNCA debe usarse para "solo ver los encabezados" a menos que esté tratando de ver cómo su servidor responde de manera diferente a aHEAD
en lugar de aGET
. Será lo mismo la mayor parte del tiempo, pero no siempre. Para ver solo el uso de encabezadoscurl -o /dev/null -D /dev/stdout
. Eso dará los resultados esperados el 100% del tiempo.La opción detallada es útil, pero si desea ver todo lo que hace curl (incluido el cuerpo HTTP que se transmite, y no solo los encabezados), sugiero usar una de las siguientes opciones:
--trace-ascii -
# stdout--trace-ascii output_file.txt
# archivofuente
Obtiene una buena salida de encabezado con el siguiente comando:
-L, --location
seguir redireccionamientos-v, --verbose
más salida, indica la dirección-s, --silent
no mostrar una barra de progreso-o, --output /dev/null
no mostrar el cuerpo recibidoO la versión más corta:
Resultados en:
Como puede ver,
curl
genera tanto los encabezados salientes como los entrantes y omite los datos del cuerpo, aunque le dice cuán grande es el cuerpo.Además, para cada línea se indica la dirección para que sea fácil de leer. Me pareció particularmente útil rastrear largas cadenas de redireccionamientos.
fuente
-v
opción con más votos. Además, solo por brevedad, esto también puede sercurl -Lvso /dev/null <target>
tan largo comoo
el final.Un comando como el siguiente mostrará tres secciones: encabezados de solicitud, encabezados de respuesta y datos (separados por CRLF). Evita la información técnica y el ruido sintáctico agregado por curl.
El comando producirá el siguiente resultado:
Descripción:
-vs
- agregue encabezados (-v) pero elimine la barra de progreso (-s)2>&1
- combina stdout y stderr en stdout simplesed
- Edite la respuesta producida por curl utilizando los siguientes comandos/^* /d
- eliminar líneas que comienzan con '*' (información técnica)/bytes data]$/d
- eliminar líneas que terminan con 'datos de bytes]' (información técnica)s/> //
- eliminar el prefijo '>'s/< //
- eliminar el prefijo '<'fuente
Tuve que superar este problema yo mismo al depurar aplicaciones web.
-v
es genial, pero demasiado detallado para mis gustos. Esta es la solución (solo bash) que se me ocurrió:Esto funciona porque la salida de
-v
se envía a stderr, no a stdout. Al redirigir esto a una subshell, podemossed
eliminar líneas que comienzan con*
. Como la salida real no pasa a través de la subshell, no se ve afectada. Usar una subshell es un poco difícil, pero es la forma más fácil de redirigir stderr a otro comando. (Como señalé, solo estoy usando esto para probar, por lo que funciona bien para mí).fuente
la opción -v para curl es demasiado detallada en la salida de error que contiene el inicio
*
(línea de estado) o>
(campo de encabezado de solicitud) o<
(campo de encabezado de respuesta). para obtener solo el campo de encabezado de solicitud:para obtener solo el campo de encabezado de solicitud:
o volcarlo en un
/tmp/test.txt
archivo con la opción -DPara filtrar la
-v
salida, debe dirigir la salida de error al terminal y la salida estándar a / dev / null, la opción -s es prohibir la medición del progresofuente
Si desea más alternativas, puede intentar instalar un cliente HTTP moderno de línea de comandos como httpie que está disponible para la mayoría de los sistemas operativos con gestores de paquetes como brew, apt-get, pip, yum, etc.
por ejemplo: - Para OSX
Luego puede usarlo en la línea de comandos con varias opciones
fuente