Obteniendo solo el encabezado de respuesta de HTTP POST usando curl


561

Uno puede solicitar solo los encabezados usando HTTP HEAD, como opción -Iencurl(1) .

$ curl -I /

Los cuerpos de respuesta HTML largos son difíciles de obtener en la línea de comandos, por lo que me gustaría obtener solo el encabezado como comentarios para mis solicitudes POST. Sin embargo, HEAD y POST son dos métodos diferentes.

¿Cómo obtengo curl para mostrar solo encabezados de respuesta a una solicitud POST?

Respuestas:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

y

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

y

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

de la página del manual. entonces

curl -sSL -D - www.acooke.org -o /dev/null

sigue los redireccionamientos, vuelca los encabezados en stdout y envía los datos a / dev / null (eso es un GET, no un POST, pero puede hacer lo mismo con un POST, solo agregue cualquier opción que ya esté utilizando para enviar datos)

tenga en cuenta el -después de -Dque indica que el "archivo" de salida es stdout.


22
el comentario anterior es válido si está utilizando powershell. para uso de cmd.execurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS para mí $ null trabajó en Win7. ¿Se debe a cLink instalado en Windows?
Satya Prakash

17
El "-" delante de la URL puede parecer poco importante, pero no lo es.
Wahid Sadik

1
@WahidSadik ¿Por qué es ese el caso en particular? ¿Cuál es la función del guión único?
mamachanko

44
@mamachanko -Dtoma un argumento que dice a dónde debe ir la salida. el guión simple significa que debería ir a stdout.
Andrew Cooke

172

Las otras respuestas requieren que se descargue el cuerpo de la respuesta. Pero hay una manera de hacer una solicitud POST que solo obtendrá el encabezado:

curl -s -I -X POST http://www.google.com

Un -I solo realiza una solicitud HEAD que puede anularse -X POSTpara realizar una solicitud POST (o cualquier otra) y solo obtener los datos del encabezado.


15
Esta respuesta es correcta porque los servidores web pueden devolver diferentes encabezados según el método de solicitud. Si desea verificar los encabezados en GET, debe usar la solicitud GET.
chhantyal

66
Esta es la respuesta más correcta, en mi opinión. Es fácil de recordar, en realidad envía una GETsolicitud y no descarga todo el cuerpo de la respuesta (o al menos no lo genera). La -sbandera no es necesaria.
skozin

@JeffPuckettII bueno, un poco tonto, diría. Puede reemplazar GETcon el POSTcomando anterior y funcionará como se esperaba. or any otherEs clave allí.
chhantyal

18
Esto no funciona cuando realmente quieres POSTalgunos datos. Curl dice:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldt El punto aquí es que un servidor puede responder de manera diferente a una solicitud HEAD que a una solicitud POST o GET (y algunos servidores realmente lo hacen), por -X HEADlo que aquí no hay una solución confiable.
siracusa el

58

El siguiente comando muestra información adicional

curl -X POST http://httpbin.org/post -v > /dev/null

Puede pedirle al servidor que envíe solo HEAD, en lugar de una respuesta completa

curl -X HEAD -I http://httpbin.org/

Note:En algunos casos, el servidor puede enviar diferentes encabezados para publicación y HEAD. Pero en casi todos los casos los encabezados son iguales.


55
Es lamentable que la otra respuesta haya ganado, porque esta es la respuesta correcta: no transfiere innecesariamente una tonelada de datos.
Daniel

1
@dmd Si entiendo el manual de cURL -X, --requestcorrectamente, -X HEADtodavía da como resultado "una tonelada de datos", pero hay lo -I, --headque debería dar como resultado lo que está anticipando.
Daniel AR Werner

1
No lo entiendes correctamente. -X HEADy -Ison exactamente equivalentes
Daniel

18
El problema -X HEADes que el servidor puede responder de manera diferente, ya que ahora recibe una HEADsolicitud en lugar de una GET(o lo que sea que fue la solicitud anterior)
Grav

44
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Dorian

53

Para los cuerpos de respuesta largos (y varias otras situaciones similares), la solución que uso siempre es conectar less, así que

curl -i https://api.github.com/users | less

o

curl -s -D - https://api.github.com/users | less

Hará el trabajo.


Estos no son equivalentes. el primero emite una HEADsolicitud a la que muchos servidores responden de manera diferente. el segundo emite una GETsolicitud que se parece más a lo que estamos buscando aquí.
glasz

25

Tal vez sea un poco extremo, pero estoy usando esta versión súper corta:

curl -svo. <URL>

Explicación:

-v imprimir información de depuración (que incluye encabezados)

-o. enviar datos de la página web (que queremos ignorar) a un determinado archivo, . en este caso, que es un directorio y un destino no válido y hace que la salida se ignore.

-s sin barra de progreso, sin información de error (de lo contrario vería Warning: Failed to create the file .: Is a directory )

advertencia: el resultado siempre falla (en términos de código de error, si es accesible o no). No utilice en, por ejemplo, declaraciones condicionales en scripts de shell ...


1
¿Por qué usar en -o.lugar de -o /dev/null?
bfontaine

@bfontaine -o.se usa versus -o /dev/nullbrevedad
exebook

no tiene el mismo comportamiento, por lo que es extraño usarlo solo para guardar 8 caracteres.
bfontaine

2
@bfontaine hay otras respuestas que muestran cómo hacer esto de la manera más correcta, esta está aquí para mostrar la alternativa corta que básicamente hace lo mismo.
exebook

Debe aclarar en su respuesta que este comando siempre falla. curl -svo. <url> && echo foono se imprimirá fooporque -o.maquillaje curldevuelve un código distinto de cero (= error): curl: (23) Failed writing body.
bfontaine


14

Si bien las otras respuestas no me han funcionado en todas las situaciones, la mejor solución que pude encontrar (trabajando POSTtambién), tomada de aquí :

curl -vs 'https://some-site.com' 1> /dev/null


1
Tuve que poner la url entre comillas para que esto funcionara.
Christophe Weis

1
Si esto es necesario o no, puede depender de la URL y del shell utilizado. Mejoré la respuesta en consecuencia. Gracias.
Daniel AR Werner

3

headcurl.cmd (versión de windows)

curl -sSkv -o NUL %* 2>&1
  • No quiero una barra de progreso -s,
  • pero lo hago errores Quiere -S,
  • sin preocuparse por los certificados https válidos -k,
  • obtener una alta verbosidad -v(se trata de la resolución de problemas, ¿no?),
  • sin salida (de forma limpia).
  • oh, y quiero reenviar stderr a stdout , para poder lidiar con todo (ya que la mayoría o toda la salida viene en stderr)
  • %*significa [pasar todos los parámetros a este script] (bueno ( https://stackoverflow.com/a/980372/444255 ), bueno, generalmente ese es solo un parámetro: la url que está probando

Ejemplo del mundo real (sobre la resolución de problemas de proxy):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Versión de Linux

para su .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

Esto descargará el cuerpo y consumirá ancho de banda, tiempo. La respuesta de @siracusa ( stackoverflow.com/a/38679650/6168139 ) no tiene esta sobrecarga.
rushi

Si desea POST, agregue -X POSTa los parámetros de paso, si desea GET, use GET (es decir, predeterminado), ya que las respuestas pueden diferir. - A menos que haga un gran curling en los scripts de producción (no para el diagnóstico y el desarrollo), no me importa un poco de ancho de banda.
Frank Nocke

Estoy planeando ver si los archivos en el servidor se actualizan o no usan 'Última modificación'. Los archivos en sí mismos son grandes, algunos están en GB y generalmente estoy en Internet celular. Entonces, este gran ancho de banda es un problema para mí.
rushi

Eso sería hacky . No necesito hacer esto ya que la respuesta de siracusa realiza la tarea con precisión.
Rushi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.