Obtendo o curl para gerar o código de status HTTP?

616

Estou usando 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?

    
por kdt 18.04.2011 / 12:28

15 respostas

381

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

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

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

    
por 18.04.2011 / 12:56
665

Uma maneira mais específica de imprimir apenas o código de status HTTP é algo como:

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

Muito mais fácil de trabalhar em scripts, já que não requer 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/
    
por 28.06.2012 / 02:25
177

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
    
por 03.05.2012 / 06:28
153

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

curl -i http://example.org

O bom de -i é que também funciona com -X POST .

    
por 04.12.2012 / 21:45
49

Se você deseja 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 substituir o processo > () e substituição do comando $ () .

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

Em seguida, use a opção -o do curl 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, redirecione a saída de volta ao descritor de arquivo STDOUT do processo atual 3 with -o >(cat >&3) . / p>

Colocando tudo junto em bash 3.2.57(1)-release (padrão para macOS ):

#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')

Observe que isso não funciona em /bin/sh como SamK anotou nos comentários abaixo .

    
por 08.01.2015 / 21:59
27

Redefina a saída de curvas:

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

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

    
por 05.08.2014 / 20:18
10

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
    
por 15.07.2015 / 22:08
10

Código de status SOMENTE

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

Todo o crédito para este GIST

    
por 08.02.2017 / 11:44
8

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]'
    
por 07.01.2016 / 09:36
7

Esta é uma limitação dolorosa de curl --fail . De man curl :

-f, --fail (HTTP) Fail silently (no output at all) on server errors

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

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

curl_with_error_code () {
    _curl_with_error_code "[email protected]" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "[email protected]" | 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 [.

    
por 06.04.2016 / 15:08
4
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

Isso retornará as seguintes informações:

  1. dados de resposta, se algum dado for retornado pela API, como erro
  2. código de status
por 08.03.2017 / 06:12
3

Aqui está um comando curl que está usando GET e que retorna o código HTTP.

curl -so /dev/null -w '%{response_code}' http://www.example.org

Lembre-se de que a abordagem abaixo está usando HEAD , que é mais rápido, mas pode não funcionar bem com alguns servidores HTTP menos compatíveis com a Web.

 curl -I http://www.example.org
    
por 23.06.2016 / 12:37
2

Use o seguinte comando cURL e canalize-o para o grep da seguinte forma:

$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP/1.1"

Veja o que cada bandeira faz:

  • -I : mostra apenas cabeçalhos de resposta
  • -s : silencioso - não mostra a barra de progresso
  • -L : siga Location: cabeçalhos

Este é um link para os códigos de status HTTP .

Execute a partir da linha de comando. Esse curl é executado no modo silencioso, segue todos os redirecionamentos, obtém os cabeçalhos HTTP. grep irá imprimir o código de status HTTP para a saída padrão.

    
por 21.11.2016 / 12:28
1

O OP quer saber o código de status. Muitas vezes, ao fazer o download de um arquivo, você também quer ter uma idéia do tamanho, então estou usando curl primeiro para mostrar o código de status e tamanho do arquivo e, em seguida, desligo o arquivo detalhado e direto para o local e nome que eu quero:

curl -R -s -S -w  "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html

Então eu espero o acabamento da onda

wait ${!}

antes de executar o próximo comando. O acima, quando usado em um script de muitos comandos como acima, dá uma boa resposta como:

http: 200 42824

http: 200 34728

http: 200 35452

Por favor, note que -o em curl precisa ser seguido pelo caminho completo do arquivo + nome do arquivo. Isso permite que você salve arquivos em uma estrutura de nome sensível ao digitá-los com ondulação. Observe também que -s e -S usados juntos silenciam a saída, mas mostram erros. Observe também que -R tenta definir o registro de data e hora do arquivo para o arquivo da web.

Minha resposta é baseada no que o @pvandenberk originalmente sugeriu, mas além disso, na verdade, salva o arquivo em algum lugar, em vez de simplesmente direcionar para / dev / null.

    
por 07.10.2017 / 09:32
1

Um exemplo de como usar os códigos de resposta. Eu uso isso para baixar novamente os bancos de dados Geolite somente se eles tiverem mudado ( -z ) & também seguindo redirecionamentos ( -L ):

url=http://example.com/file.gz
file=$(basename $url)

response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")

case "$response" in
        200) do_something ;;
        301) do_something ;;
        304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
        404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
          *) printf "Received: HTTP $response ==> $url\n" ;;
esac
    
por 01.04.2018 / 19:21