Obtenha o corpo da resposta e mostre o código HTTP por curl

3

Eu tenho endpoint que retorna JSON (corpo da resposta). Eu preciso obter curl o corpo de resposta e processá-lo (por exemplo, usando jq). Funciona:

response=$(curl -s https://swapi.co/api/people/1/?format=json)
name=$(echo $response tmpFile | jq '.name') # irrelevant command, but I need here response body
echo "name:"$name

Mas também preciso mostrar o código HTTP (para mostrar se a solicitação foi bem-sucedida):

curl -s -w "%{http_code}\n" -o /dev/null https://swapi.co/api/people/1/?format=json

Como obter o corpo da resposta para a variável e mostrar o código HTTP ao mesmo tempo (uma solicitação)?

Eu descobri o arquivo temporário da solução:

touch tmpFile
curl -s -w "%{http_code}\n" -o tmpFile https://swapi.co/api/people/1/?format=json
name=$(cat tmpFile | jq '.name') # irrelevant command, but I need here only body response
echo "name: "$name
rm tmpFile

Como fazer sem criar um arquivo?

Eu tento com pipe nomeado (mas ainda preciso criar um arquivo no disco ...):

mkfifo tmpFifo
curl -s -w "%{http_code}\n" -o tmpFifo https://swapi.co/api/people/1/?format=json
name=$(cat tmpFifo | jq '.name') # irrelevant command, but I need here only body response
echo "name: "$name
rm tmpFifo

Mas o pipe nomeado não está sendo removido.

Existe solução sem criar nenhum arquivo, por exemplo, apenas variáveis ou fluxos de bruxas?

    
por mkczyk 08.05.2018 / 11:28

2 respostas

2

Parece que o conteúdo da resposta é uma única linha. Você pode usar duas chamadas read para ler duas linhas:

curl -s -w "\n%{http_code}" 'https://swapi.co/api/people/1/?format=json' | {
    read body
    read code
    echo $code
    jq .name <<< "$body"
}
    
por 09.05.2018 / 23:52
0

Solução com corpo de retorno e código HTTP na última linha:

response=$(curl -s -w "\n%{http_code}" https://swapi.co/api/people/1/?format=json)
response=(${response[@]}) # convert to array
code=${response[-1]} # get last element (last line)
body=${response[@]::${#response[@]}-1} # get all elements except last
name=$(echo $body | jq '.name')
echo $code
echo "name: "$name

Mas ainda prefiro fazer isso com duas variáveis separadas / streams em vez de concatenar corpo de resposta e código HTTP em uma variável.

    
por 08.05.2018 / 11:59

Tags