从卷曲请求获取状态代码和响应正文

时间:2019-01-04 11:31:10

标签: bash shell curl

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

我发现此答案非常有帮助:https://superuser.com/a/862395/148175 用户描述了他如何创建重定向到3的新文件描述符STDOUT

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

我的问题是我想在函数中运行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的函数在子外壳中运行,因此应将输出定向到变量responsedata

1 个答案:

答案 0 :(得分:2)

据我了解,如果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=$(echo $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

编辑:简化了卷曲响应中状态代码的评估,从而仅获取状态代码的最后三个字符。