Получить код состояния и тело ответа из запроса Curl - PullRequest
0 голосов
/ 04 января 2019

Я хочу проверить http-коды ответа от curl, но все же смогу получить возвращенные данные и сохранить их в переменной.

Я нашел этот ответ очень полезным: https://superuser.com/a/862395/148175 Пользователь описывает, как он создал новый дескриптор файла 3, который перенаправляет на STDOUT.

Затем он запустил curl в подоболочке, где он захватил вывод -w "%{http_code}" в переменную HTTP_STATUS и вывод в STDOUT с помощью -o >(cat >&3).

Моя проблема в том, что я хочу записать вывод STDOUT в переменную после того, как я запустил curl внутри функции.

Это мой сценарий:

#!/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 голосов
/ 06 января 2019

Насколько я понимаю, вы хотите, чтобы эта функция выводила 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

Редактировать: Упрощенная оценка кода состояния из ответа скручивания, чтобы просто получить последние три символа a.k.a. код состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...