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?
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.
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.
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 :
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:
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/*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 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.
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.
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.)
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:
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
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
curl --head http://google.com
vai fazer o mesmo que o-I
flag :)--head
/-I
: nem todos os servidores respondem exatamente da mesma maneira àsHEAD
solicitações (por exemplo,Content-Encoding
estariam ausentes se você estivesse tentando verificar se o corpo seria compactado com gzip) e nem todos os servidores suportamHEAD
.-v
geralmente é a escolha mais segura.Respostas:
curl
-v
ou--verbose
opção mostra os cabeçalhos de solicitação HTTP, entre outras coisas. Aqui está um exemplo de saída:fonte
Uma resposta popular para exibir cabeçalhos de resposta , mas o OP perguntou sobre cabeçalhos de solicitação .
-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 respostaIsso é melhor do
-I
que não enviar umaHEAD
solicitação, o que pode produzir resultados diferentes.É melhor do que
-v
porque você não precisa de tantos hacks para cancelar a descrição.fonte
curl -sD - -o NULL http://example.com
/dev/null
no Windowsnul
não énull
.Acredito que a opção da linha de comando que você está procurando passar para o curl seja
-I
.Exemplo de uso:
Além disso, se você encontrar um código de status HTTP de resposta 301, também poderá passar uma
-L
opção de argumento para dizercurl
para seguir os redirecionamentos de URL e, nesse caso, imprimir os cabeçalhos de todas as páginas (incluindo os redirecionamentos de URL), ilustrados abaixo :fonte
-I
opção mostra os cabeçalhos de resposta . A pergunta era sobre os cabeçalhos da solicitação .-I
opções fazem com que curl faça umHTTP HEAD
, o que pode alterar a resposta do servidor. Melhor usar o-v
interruptor, eu acredito.HEAD
solicitaçã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-I
faz umaHEAD
solicitação, comoacw
declarado, e quando suacurl
chamada é configurada para fazer outra chamada, você tem duas solicitações HTTP emcurl
chamada ...HEAD
vez deGET
ouPOST
. 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 umHEAD
e não aGET
. Será o mesmo na maioria das vezes, mas nem sempre. Para ver apenas os cabeçalhos usamcurl -o /dev/null -D /dev/stdout
. Isso dará os resultados esperados 100% do tempo.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
# Arquivofonte
Você obtém uma boa saída de cabeçalho com o seguinte comando:
-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 recebidoOu a versão mais curta:
Resulta em:
Como você pode ver as
curl
saí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.
fonte
-v
opção com votos mais altos. Além disso, apenas por uma questão de brevidade, isso também pode sercurl -Lvso /dev/null <target>
contanto queo
chegue no final.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.
O comando produzirá a seguinte saída:
Descrição:
-vs
- adicione cabeçalhos (-v) mas remova a barra de progresso (-s)2>&1
- combine stdout e stderr em stdout únicosed
- 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 '<'fonte
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:Isso funciona porque a saída de
-v
é enviada para stderr, não stdout. Ao redirecionar isso para um subshell, podemossed
remover 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.)fonte
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:para obter apenas o campo de solicitação:
ou despejá-lo em
/tmp/test.txt
arquivo com a opção -Dpara filtrar a
-v
saí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 progressofonte
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
Então você pode usá- lo na linha de comando com várias opções
fonte