首页 > 解决方案 > 从 Curl 请求中获取状态码和响应正文

问题描述

我想检查 http 响应代码,curl但仍然能够检索返回的数据并将其存储在变量中。

我发现这个答案非常有帮助:https ://superuser.com/a/862395/148175 用户描述了他如何创建一个3重定向到STDOUT.

然后他curl在一个子shell中运行,在那里他将 的输出捕获-w "%{http_code}"到一个变量HTTP_STATUS中,并将输出捕获到 STDOUT 中-o >(cat >&3)

我的问题是我想在函数中运行 curl 后将 STDOUT 的输出捕获到变量中。

这是我的脚本:

#!/bin/bash

exec 3>&1

function curlBinData {
    HTTP_STATUS=$(curl -s -w "%{http_code}" -o >(cat >&3) https://www.google.com --data-binary $1)
    if [ $HTTP_STATUS -ne 200 ]; then
        echo Error: HTTP repsonse is $HTTP_STATUS
        exit
    fi
}

responsedata=$(curlBinData '{"head":5}')
echo $responsedata

它能做什么:

curl 的输出被定向到STDOUT控制台窗口并在控制台窗口中打印。

想要什么

由于函数调用curl是在子 shell 中运行的,因此它应该将输出定向到变量responsedata.

标签: bashshellcurl

解决方案


据我了解,Error: HTTP repsonse is $status如果$status不等于,您希望此函数输出200,否则输出响应正文,所以这里是代码。我没有看到需要额外的文件描述符,所以我删除了它。

#!/bin/bash
function curlBinData {
    local res=$(curl -s -w "%{http_code}" https://www.google.com --data-binary $1)
    local body=${res::-3}
    local status=$(printf "%s" "$res" | tail -c 3)
    if [ "$status" -ne "200" ]; then
        echo "Error: HTTP repsonse is $status"
        exit
    fi
    echo $body
}

responsedata=$(curlBinData '{"head":5}')
echo $responsedata

编辑:简化了 curl 响应中状态码的评估,只得到最后三个字符,也就是状态码。


推荐阅读