通过 curl 获取响应正文并显示 HTTP 代码

mkc*_*zyk 14 bash curl pipe

我有返回 JSON(响应正文)的端点。我需要通过 curl 响应主体并对其进行处理(例如使用 jq)。有用:

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
Run Code Online (Sandbox Code Playgroud)

但我还需要显示 HTTP 代码(以显示请求是否成功):

curl -s -w "%{http_code}\n" -o /dev/null https://swapi.co/api/people/1/?format=json
Run Code Online (Sandbox Code Playgroud)

如何将响应主体设置为变量并同时显示 HTTP 代码(一个请求)?


我找到了解决方案女巫临时文件:

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
Run Code Online (Sandbox Code Playgroud)

不创建文件怎么办?

我尝试使用命名管道(但它仍然需要在磁盘上创建文件...):

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
Run Code Online (Sandbox Code Playgroud)

但是命名管道没有删除。

有没有创建任何文件的解决方案,例如只有女巫变量或流?

jan*_*nos 13

看起来响应的内容是一行。您可以使用两个read调用来读取两行:

curl -s -w "\n%{http_code}" 'https://swapi.co/api/people/1/?format=json' | {
    read body
    read code
    echo $code
    jq .name <<< "$body"
}
Run Code Online (Sandbox Code Playgroud)


mkc*_*zyk 7

最后一行包含返回正文和 HTTP 代码的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

但我仍然宁愿使用两个单独的变量/流来完成此操作,而不是在一个变量中连接响应正文和 HTTP 代码。