Como exibir cabeçalhos de solicitação com ondulação da linha de comando

568

A ondulação da linha de comando pode exibir o cabeçalho da resposta usando a -Dopção, mas quero ver qual cabeçalho de solicitação está enviando. Como eu posso fazer isso?

wwwxml
fonte
28
curl --head http://google.comvai fazer o mesmo que o -Iflag :)
Abel Terefe
9
Nota sobre o uso de --head/ -I: nem todos os servidores respondem exatamente da mesma maneira às HEADsolicitações (por exemplo, Content-Encodingestariam ausentes se você estivesse tentando verificar se o corpo seria compactado com gzip) e nem todos os servidores suportam HEAD. -vgeralmente é a escolha mais segura.
cfeduke

Respostas:

752

curl -vou --verboseopção mostra os cabeçalhos de solicitação HTTP, entre outras coisas. Aqui está um exemplo de saída:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0
Asaph
fonte
6
E se eu apenas quiser construir o pacote, mas não quiser enviá-lo?
PuercoPop
@jacobsimeon Acho que é porque mostra não apenas os cabeçalhos de solicitação, mas também os cabeçalhos de resposta e o corpo da resposta .
PMPR
235

Uma resposta popular para exibir cabeçalhos de resposta , mas o OP perguntou sobre cabeçalhos de solicitação .

curl -s -D - -o /dev/null http://example.com
  • -s : Evite mostrar a barra de progresso
  • -D -: Despejar cabeçalhos em um arquivo, mas -enviá-lo para stdout
  • -o /dev/null : Ignorar corpo de resposta

Isso é melhor do -Ique não enviar uma HEADsolicitação, o que pode produzir resultados diferentes.

É melhor do que -vporque você não precisa de tantos hacks para cancelar a descrição.

JaffaTheCake
fonte
17
Leia a pergunta - isto é para cabeçalhos de resposta não cabeçalhos de solicitação
Graeme Stuart
58
Esta resposta é útil para mim, porque eu também interpretei mal a pergunta.
Liam
2
Este comando é um pouco diferente para o Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov Na verdade, o equivalente /dev/nullno Windows nulnão é null.
Francisco Zarabozo
2
Mesmo que essa pergunta solicite cabeçalhos de solicitação, o Google está direcionando todos os que estão procurando cabeçalhos de resposta, por isso estamos felizes por esta resposta estar aqui. E essa resposta é a melhor para obter cabeçalhos de resposta. Obrigado!!!
26519 biomiker
96

Acredito que a opção da linha de comando que você está procurando passar para o curl seja -I.

Exemplo de uso:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

Além disso, se você encontrar um código de status HTTP de resposta 301, também poderá passar uma -Lopção de argumento para dizer curlpara seguir os redirecionamentos de URL e, nesse caso, imprimir os cabeçalhos de todas as páginas (incluindo os redirecionamentos de URL), ilustrados abaixo :

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html
evandrix
fonte
38
A -Iopção mostra os cabeçalhos de resposta . A pergunta era sobre os cabeçalhos da solicitação .
Asaph
53
As -Iopções fazem com que curl faça um HTTP HEAD, o que pode alterar a resposta do servidor. Melhor usar o -vinterruptor, eu acredito.
ACW
1
Se você tentar isso com outra coisa que não uma HEADsolicitação (como -X POST) e obter "Você pode selecionar apenas uma solicitação HTTP!" que stackoverflow.com/questions/286982/… provavelmente o ajudará. O problema é que -Ifaz uma HEADsolicitação, como acwdeclarado, e quando sua curlchamada é configurada para fazer outra chamada, você tem duas solicitações HTTP em curlchamada ...
flu
7
Esta é uma resposta muito errada. (Eu prometo que geralmente sou muito gentil aqui.) 1. Faz o oposto do que o OP pede. 2. Ele usa um método de solicitação de em HEADvez de GETou POST. 3. NUNCA deve ser usado para "apenas ver os cabeçalhos", a menos que você esteja tentando ver como o servidor responde de maneira diferente a um HEADe não a GET. Será o mesmo na maioria das vezes, mas nem sempre. Para ver apenas os cabeçalhos usam curl -o /dev/null -D /dev/stdout. Isso dará os resultados esperados 100% do tempo.
de Bruno Bronosky
79

A opção detalhada é útil, mas se você quiser ver tudo o que o curl faz (incluindo o corpo HTTP transmitido e não apenas os cabeçalhos), sugiro usar uma das opções abaixo:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # Arquivo
William Denniss
fonte
Eu não penso assim, pois mostra a resposta cabeçalhos e corpo também!
Pmpr
56

Você obtém uma boa saída de cabeçalho com o seguinte comando:

 curl -L -v -s -o /dev/null google.de
  • -L, --location siga redirecionamentos
  • -v, --verbose mais saída, indica a direção
  • -s, --silent não mostrar uma barra de progresso
  • -o, --output /dev/null não mostra o corpo recebido

Ou a versão mais curta:

 curl -Lvso /dev/null google.de

Resulta em:

* Rebuilt URL to: google.de/
*   Trying 2a00: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.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15: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/'
*   Trying 2a00: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.1 200 OK
< Date: Fri, 12 Aug 2016 15: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-2017 15: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 você pode ver as curlsaídas, os cabeçalhos de saída e os de entrada, pula os dados do corpo, embora você diga o tamanho do corpo.

Além disso, para cada linha, a direção é indicada para facilitar a leitura. Eu achei particularmente útil rastrear longas cadeias de redirecionamentos.

Benibr
fonte
4
Eu gosto disso melhor do que a -vopção com votos mais altos. Além disso, apenas por uma questão de brevidade, isso também pode ser curl -Lvso /dev/null <target>contanto que ochegue no final.
grito
12

Um comando como o abaixo mostrará três seções: cabeçalhos de solicitação, cabeçalhos de resposta e dados (separados por CRLF). Evita informações técnicas e ruídos sintáticos adicionados pelo curl.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

O comando produzirá a seguinte saída:

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

Descrição:

  • -vs - adicione cabeçalhos (-v) mas remova a barra de progresso (-s)
  • 2>&1 - combine stdout e stderr em stdout único
  • sed - editar resposta produzida por curl usando os comandos abaixo
  • /^* /d - remova linhas começando com '*' (informações técnicas)
  • /bytes data]$/d - remover linhas que terminam com 'bytes data]' (informações técnicas)
  • s/> // - remova o prefixo '>'
  • s/< // - remova o prefixo '<'
igorpcholkin
fonte
7

Eu mesmo tive que superar esse problema ao depurar aplicativos da web. -vé ótimo, mas um pouco detalhado demais para o meu gosto. Esta é a solução (apenas para o bash) que eu vim com:

curl -v http://example.com/ 2> >(sed '/^*/d')

Isso funciona porque a saída de -vé enviada para stderr, não stdout. Ao redirecionar isso para um subshell, podemos sedremover linhas que começam com *. Como a saída real não passa pelo subshell, ela não é afetada. Usar um subshell é um pouco pesado, mas é a maneira mais fácil de redirecionar o stderr para outro comando. (Como observei, só estou usando isso para teste, por isso funciona bem para mim.)

jpfx1342
fonte
4

a opção -v para curl é muito detalhada na saída de erro que contém o início *(linha de status) ou >(campo de solicitação) ou <(campo de resposta). para obter apenas o campo de solicitação:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

para obter apenas o campo de solicitação:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

ou despejá-lo em /tmp/test.txtarquivo com a opção -D

curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null

para filtrar a -vsaída, você deve direcionar a saída de erro para o terminal e a saída std para / dev / null, a opção -s é proibir a medição do progresso

toolchainX
fonte
1

Se você quiser mais alternativas, tente instalar um cliente HTTP moderno de linha de comando como httpie, disponível para a maioria dos sistemas operacionais com gerenciadores de pacotes como brew, apt-get, pip, yum etc.

por exemplo: - Para OSX

brew install httpie

Então você pode usá- lo na linha de comando com várias opções

http GET https://www.google.com

insira a descrição da imagem aqui

Sudharshan
fonte