【问题标题】:Get the value from the header从标头中获取值
【发布时间】:2021-09-21 15:32:46
【问题描述】:

是否有可能以某种方式从标头中获取值并立即将其加载到变量中?

标题:

HTTP/1.1 201 CREATED
Date: Mon, 12 Jul 2021 10:23:01 GMT
Server: Apache
Content-Length: 3218
X-Subject-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Vary: X-Auth-Token
x-openstack-request-id: XXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/json

需要将X-Subject-Token 放入变量中。

【问题讨论】:

  • 是的,这是可能的。您尝试过什么来解决问题?你被困在哪里了?
  • 有时您可以使用--write-out 选项(又名-weverything.curl.dev/usingcurl/verbose/writeout,但我不确定是否有适合X-Subject-Token 情况的变量。

标签: bash api curl openstack


【解决方案1】:
# read the _lines_ of the header into an array
mapfile -t header < <(curl --head ...)

declare -A values
for h in "${header[@]}"; do
    if [[ $h =~ ^([^:]+):" "(.*) ]]; then
        values[${BASH_REMATCH[1]}]=${BASH_REMATCH[2]}
    fi
done

declare -p values
echo "${values[X-Subject-Token]}"

有时标头可以跨越多行或以不同的字符集编码,因此这种方法并非万无一失。

此外,标头字段名称不区分大小写,因此您可能需要这样做:

declare -l field    # variable has lower-case attribute
for h in "${header[@]}"; do
    if [[ $h =~ ^([^:]+):" "(.*) ]]; then
        field=${BASH_REMATCH[1]}
        value=${BASH_REMATCH[2]}
        values[$field]=$value
    fi
done
echo "${values[x-subject-token]}"

【讨论】:

    【解决方案2】:

    使用 的稍微不那么复杂的解决方案:

    curl -v myurl.com 2>&1 | grep '< X-Subject-Token' | sed 's/.*: //'
    

    在哪里

    • 2&gt;&amp;1重定向标准错误
    • grep '&lt; X-Subject-Token' 只保留包含&lt; X-Subject-Token 的行
    • sed 's/.*: //' 删除了 之后 : 的行,所以我们保留了值

    【讨论】:

    • 正则表达式是贪婪的,所以如果主题标记包含一个“冒号空格”,你就没有得到整个值。
    【解决方案3】:

    使用awk

    var=$(curl -v ...|awk -F ':' '/^X-Subject-Token/ {print $2}')
    
    echo "$var"
    

    【讨论】:

    • 非常感谢。以及如何解决一开始的问题?
    • 你说的开头有问题是什么意思?
    • 目前输出如下:#: cat token.txt#: Hkfdflkmgldmgdmgmddgdgm_gd_MMLM但必须:#: Hkfdflkmgldmgdmgmddgdgm_gd_MMLM
    • 错误导致换行.. echo $TOKEN123 | sed -e 's/\r$//'
    • @Kaber:您能否更新问题中 curl 命令的输出,以便我们可以知道 X-Subject-Token 的实际值是多少……谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多