Eu uso curl para obter cabeçalhos http para encontrar o código de status http e também retornar uma resposta. Recebo os cabeçalhos http com o comando
curl -I http://localhost
Para obter a resposta, uso o comando
curl http://localhost
Assim que uso o sinalizador -I, obtenho apenas os cabeçalhos e a resposta não está mais lá. Existe uma maneira de obter a resposta http e o código de status headers / http em um comando?
Respostas:
Consegui obter uma solução olhando para o documento curl que especifica o uso
-
para a saída para obter a saída para stdout.Para obter a resposta apenas com o código de retorno http, eu poderia apenas fazer
fonte
-i
. Ou talvez-v
se você quiser alguma informação adicional também.-o -I
acaba criando um arquivo chamado literalmente '-I
' no CWD. Alguém mais vê isso? A solução para isso é-o/dev/null -I
o modo verboso vai te dizer tudo
fonte
Eu uso este comando para imprimir o código de status sem qualquer outra saída. Além disso, ele executará apenas uma solicitação HEAD e seguirá o redirecionamento (respectivamente
-I
e-L
).Isso torna muito fácil verificar o código de status em um script de integridade:
fonte
curl -o -I -L -s -w "%{http_code}" http://localhost
um arquivo é criado chamado-I
, para contornar isso eu adicionei um local para a saída do arquivo implícito-o
em ir, a saber/dev/null
:curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Eu encontrei esta pergunta porque eu queria AMBOS a resposta e o conteúdo, a fim de adicionar algum tratamento de erro para o usuário.
Você pode imprimir o código de status HTTP para saída padrão e gravar o conteúdo em outro arquivo.
Isso permite que você use a lógica para decidir se vale a pena processar a resposta.
fonte
A
-i
opção é a que você deseja:Como alternativa, você pode usar a opção detalhada:
fonte
Eu usei isto:
Para obter o status HTTP
Para obter o corpo de resposta, usei este
fonte
Este comando
obterá o corpo e o status separados por vírgulas; você pode dividi-los para tirá-los.
Você pode alterar o delimitador como desejar.
fonte
Para uso programático, eu uso o seguinte:
Mostra a seguinte saída:
fonte
Esta é uma maneira de recuperar o corpo "E" o código de status e formatá-lo para um json adequado ou qualquer formato que funcione para você. Alguns podem argumentar que é o uso incorreto da opção de formato de gravação, mas isso funciona para mim quando preciso do corpo e do código de status em meus scripts para verificar o código de status e retransmitir as respostas do servidor.
execute o código acima e você deve obter um json neste formato:
com a opção de formato de gravação -w, uma vez que stderr é impresso primeiro, você pode formatar sua saída com var http_code e colocar o corpo da resposta em um valor (corpo) e seguir o fechamento usando var stdout. Em seguida, redirecione sua saída stderr para stdout e você será capaz de combinar http_code e corpo de resposta em uma saída elegante
fonte
curl: unknown --write-out variable: 'stderr'
ecurl: unknown --write-out variable: 'stdout'
Minha maneira de conseguir isso :
Para obter ambos (cabeçalho e corpo), geralmente executo um
curl -D- <url>
como em:Isso irá despejar headers (
-D
) em stdout (-
) (Procure--dump-header
em man curl ).IMHO também é muito útil neste contexto:
Costumo usar jq para obter os dados json (por exemplo, de algumas APIs restantes) formatados. Mas, como o jq não espera um cabeçalho HTTP, o truque é imprimir os cabeçalhos no stderr usando
-D/dev/stderr
. Observe que, desta vez, também usamos-sS
(--silent, --show-errors) para suprimir o medidor de progresso (porque gravamos em um tubo).Eu acho que isso também pode ser útil se você quiser imprimir cabeçalhos (para inspeção rápida) para o console, mas redirecionar o corpo para um arquivo (por exemplo, quando é algum tipo de binário para não bagunçar o seu terminal):
Esteja ciente: NÃO é o mesmo que
curl -I <url>
! As-I
executará umaHEAD
solicitação e não umaGET
solicitação (Procure--head
em man curl . Sim: para a maioria dos servidores HTTP, isso produzirá o mesmo resultado. Mas eu conheço muitos aplicativos de negócios que não implementamHEAD
solicitação de forma alguma ;-Pfonte
fonte