curl escreve código http para stderr ou para arquivo

3

Estou escrevendo alguns scripts para testar uma API. Estou interessado na resposta JSON, bem como no código de status HTTP da solicitação. Eu definitivamente quero imprimir bastante a resposta JSON para facilitar a leitura.

Estou usando curl para executar a solicitação e quero usar python -m json.tool para imprimir bem o resultado do json.

O Curl tem uma boa opção -w que pode ser usada para exibir informações sobre a solicitação, como %{http_code} . Infelizmente, essas informações são impressas para stdout e confundem python -m json.tool . Parece que não é possível configurá-lo para ignorar dados não json à direita.

Quando faço

curl \
'--silent' \
'--insecure' \
'-L' \
'-w' \
'\n%{http_code}\n' \
'--user' \
<REDACTED> \
'-X' \
'GET' \
'--' \
'https://somecompany.com/some_api_endpoint' \
| python -m json.tool

Eu obtenho

$ bash call_api_endpoint_script.sh 
Extra data: line 2 column 1 - line 3 column 1 (char 203 - 207)
Exit 1

Existe uma maneira de configurar curl para gravar o código de status em um arquivo? A opção -w na página man não parece mencionar a possibilidade de redirecionar esta informação para outro lugar.

    
por Gregory Nisbet 06.02.2017 / 20:02

4 respostas

2

Encontrei uma maneira de resolver esse problema usando -o para redirecionar apenas o conteúdo para um arquivo temporário, deixando apenas o código de status na saída do curl.

Eu posso então ler o conteúdo do arquivo temporário de python -m json.tool e imprimi-los.

Por exemplo,

content=$(mktemp)

curl \
...
-w \
'HTTP_STATUS_CODE: %{http_code}\n' \
...
-o \
"$content" \
-- \
'https://somecompany.com/some_api_endpoint'

<"$content" python -m json.tool
    
por 07.02.2017 / 05:23
1

Se você usar jq em vez de python -m json.tool , verá que ele analisa JSON até mesmo com texto à direita:

$ echo '{ "foo": "bar" } text' | ./jq
{
  "foo": "bar"
}
parse error: Invalid literal at line 2, column 0

É claro que se você quiser ignorar a mensagem de erro, basta redirecionar para /dev/null .

Observe também que, com jq , se você quiser usar sua saída em um canal ou redirecioná-la para um arquivo, acho que é necessário fornecer um argumento de "filtro":

echo '{ "foo": "bar" } trailing text' | jq . > OUT.json

. é o filtro mais simples possível. Significa "pegar a entrada e produzi-la inalterada como saída".

    
por 07.02.2017 / 04:46
0

I definitely want to pretty-print the JSON response in order to make it easier to read.

É exatamente isso que o link serve. enviando GET, POST, PUT, DELETE, PATCH etc para API e imprimir uma resposta JSON.

Quanto à parte curva da sua pergunta, não tenho ideia, desculpe.

    
por 06.02.2017 / 20:46
0

Enquanto o write-out de -w vai para stdout , a saída de -o pode ser redirecionada para qualquer arquivo. Em particular, você poderia direcioná-lo para stderr com -o /dev/stderr . Se você trocar agora stderr e stdout (com 3>&1- 1>&2- 2>&3- ) você estará em posição de ver seu código de retorno HTTP (através de stderr) enquanto direciona sua saída para o programa desejado.

Em outras palavras, algo nos moldes de:

curl ... -w 'HTTP_STATUS_CODE: %{http_code}\n' -o /dev/stderr ... | 3>&1- 1>&2- 2>&3- | python -m json.tool
    
por 29.06.2018 / 19:11

Tags