Questão Obtendo o curl para emitir o código de status HTTP?


estou a usar curl na linha de comando no Linux para emitir solicitações HTTP. Os corpos de resposta são impressos no padrão, o que é bom, mas não consigo ver na man page como obter o curl para imprimir o código de status HTTP da resposta (404, 403 etc.). Isso é possível?


559


origem


Quanto a mim, posso ver no manual como obter o código de status HTTP, mas a opção -w não funciona. Eu relatei o bug para a Apple. - Nicolas Barbulesco
o -i bandeira, como em curl -i https://www.example.com/, é provavelmente o que você quer, conforme superuser.com/a/514798/190188 - caw


Respostas:


Isso deve funcionar para você E se o servidor da web é capaz de responder a solicitações HEAD (isso não executará GET):

curl -I http://www.example.org

Como complemento, para deixar o cURL seguir redirecionamentos (status 3xx), adicione -L.


350



NB: curl -I faz uma solicitação HTTP HEAD, que pode ser problemática para testar o código de status HTTP para alguns servidores e serviços de aplicativos da web - Jay Taylor
E para obter apenas o número do status, canalize-o para head -n 1|cut -d$' ' -f2 - Benubird
Não esqueça de redirecionar o stderr da onda: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Adicione -L para curl se você precisar do status final após os redirecionamentos. - Aaron Blenkush
Seguir o redirecionamento depois de fazer apenas uma solicitação HEAD pode causar um comportamento interessante, dependendo de como o aplicativo está programado. - Scott McIntyre
curl -I -X GET enviará uma solicitação GET, mas fornecerá a mesma saída. - jiggy


Uma maneira mais específica de imprimir somente o código de status HTTP é algo nos moldes de:

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

Muito mais fácil de trabalhar em scripts, pois não requer qualquer análise :-)

O parâmetro -I pode ser adicionado para melhorar o desempenho da carga de resposta. Esse parâmetro apenas solicita status / cabeçalhos de resposta, sem o corpo da resposta do download. (% {http_code} retorna na primeira linha da carga HTTP)

ou seja:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

625



-w "% {http_code}" é o bit que imprime o código de status. Você pode adicionar uma nova linha ou duas para separar o código do corpo (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Uau, isso /dev/null coisa ainda funciona na versão do Windows de curl que estou usando. - Uwe Keim
Acredito que isso faça o download do arquivo inteiro, mesmo que tudo vá para / dev / null, portanto, não é ideal para verificar o código de status de arquivos grandes. httping -c 1 -s -G -m emite um GET e não faz o download do arquivo inteiro, embora eu saiba que essa questão é especificamente sobre o curl. - RomanSt
@romkyns, você está correto: a primeira variante na minha resposta faz o download do arquivo inteiro e "salva" para /dev/null, mas a segunda variante - ou seja. aquele usando o -I opção para curl - não faz. No entanto, é preciso ter cuidado, pois você não está realmente testando a mesma ação: um faz um HTTP GET pedido, enquanto o outro faz uma HEAD solicitar ... alguns servidores / websites responderão com um código de status diferente, mesmo que o URL solicitado seja exatamente o mesmo! - pvandenberk
PARA SUA INFORMAÇÃO: -s = Não mostra o progresso do download -o /dev/null = não exibir o corpo, -w "%{http_code}" = Escreva o código de resposta http para stdout após sair. - Ajedi32


Se você quiser ver o cabeçalho e o resultado, use a opção detalhada:

curl -v http://www.example.org
curl --verbose http://www.example.org

O status aparecerá no cabeçalho. Por exemplo.

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

171



O +1 para apontar a bandeira detalhada fornece os detalhes extras. Ótimo para testar aplicativos REST. - MrOodles
+1 muito fácil de usar ao fazer uma solicitação POST (curl -v --data "...") - MegaTux
Ele até os divide em duas saídas de arquivo diferentes (detalhes de status http para stderr e corpo de resposta para stdout) - Blauhirn


Você pode imprimir o código de status, além de todos os cabeçalhos, fazendo o seguinte:

curl -i http://example.org

A coisa boa sobre -i é que funciona com -X POST também.


142



Muito melhor que a resposta aceita (que faz um pedido HEAD). - neu242
Talvez óbvio, mas -i funciona com qualquer Método HTTP, não apenas GET e POST... :) - mac
a melhor resposta, uma vez que faz com que a saída de curvatura cabeçalhos e corpo, tornando-o adequado para a maioria das tarefas quando usado em um script - Sarge Borsch
Esta é a melhor resposta e pode ser usada em conjunto com -s (não mostra o medidor de progresso ou mensagens de erro) e -S(mostre mensagens de erro depois de tudo) - Jonathan Hartley


Se você quiser capturar o código de status HTTP em uma variável, mas ainda redirecionar o conteúdo para STDOUT, deverá criar dois STDOUTs. Você pode fazer isso com substituição de processo> () e substituição de comando $ ().

Primeiro, crie um descritor de arquivo 3 para o seu processo atual 'STDOUT com exec 3>&1.

Então, use o curl -o opção para redirecionar o conteúdo da resposta para um fifo temporário usando a substituição de comando e, em seguida, dentro dessa substituição de comando, redireciona a saída de volta para o descritor de arquivo STDOUT do processo atual 3 com -o >(cat >&3).

Juntando tudo:

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

45



Isso é sérias escorregadelas ... e eu gosto disso! - spyle
Agora, como, por sua vez, posso redirecionar a saída para outra variável? - Roger Filmyer
A saída está em STDOUT, então você deve ser capaz de redirecionar a saída do comando para qualquer lugar que você goste, como um comando normal. Eu não testei isso embora. - Heath Borders


Redefinir saída de curvatura:

curl -sw '%{http_code}' http://example.org

Pode ser usado com qualquer tipo de solicitação.


26



-k (--insecure) está substituindo -s (silencioso). - Ravichandra


Isto irá enviar um pedido para url, obter apenas a primeira linha da resposta, dividir em blocos e selecionar o segundo.

Ele contém o código de resposta

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10



Você pode explicar o que esse código faz e como ele resolve o problema dado pelo OP? Código inexplicável pode parecer não confiável e perigoso para os usuários. - bwDraco
Claro, enviamos um pedido para url, obtemos apenas a primeira linha da resposta, dividimos em blocos e selecionamos o segundo. Ele contém o código de resposta que o OP está procurando. - Filip Spiridonov


Para uma solicitação POST, o seguinte funcionou:

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

8





Código de status

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

Todo o crédito para isso ESSÊNCIA


8





Isso é doloroso curl --fail limitação. A partir de man curl :

-f, --fail       (HTTP) Falha silenciosamente (sem saída) em erros do servidor

Mas não há como obter o código de retorno diferente de zero E o corpo da resposta no stdout.

Baseado em pvandenberkresposta e este outro truque muito útil aprendido em SO, aqui está uma solução alternativa:

curl_with_error_code () {
    _curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
    curl_error_code=$?
    exec 17>&-
    if [ $curl_error_code -ne 0 ]; then
        return $curl_error_code
    fi
    if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
        echo "HTTP $http_code" >&2
        return 127
    fi
}

Esta função se comporta exatamente como curl, mas retornará 127 (um código de retorno não usado por curl) no caso de um código HTTP no intervalo [400, 600 [.


7



De acordo, não ser capaz de ver a saída do erro é uma dolorosa limitação do que, de outra forma, seria muito útil - falha. Como você pode diagnosticar uma falha de API REST sem ver a saída de erro? É tão lamentável que o bagder mantenedor insistir teimosamente em não fornecer um erro --fail-but-show. github.com/curl/curl/issues/1978 - jamshid