API вызова сценария оболочки через curl и ответ процесса - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно создать сценарий оболочки, который вызывает мой API входа через curl.Сценарий должен иметь возможность хранить и обрабатывать ответ от вызова curl api.

myscript.sh

#!/bin/bash

echo "Extract bearer token from curl calling login api"
echo
# Check cURL command if available (required), abort if does not exists
type curl >/dev/null 2>&1 || { echo >&2 "Required curl but it's not installed. Aborting."; exit 1; }
echo

PAYLOAD='{"email": "dummy-user@acme.com", "password": "secret"}'

curl -s --request POST -H "Content-Type:application/json"  http://acme.com/api/authentications/login --data "${PAYLOAD}"

Моя проблема в данном сценарии:

  1. он не получает ответ curl, вызывающий API.
  2. Из ответа json получают только значение токена.

Пример входа в системуОтвет API:

{
  "user": {
    "id": 123,
    "token": "<GENERATED-TOKEN-HERE>",
    "email": "dummy-user@acme.com",
    "refreshToken": "<GENERATED-REFRESH-TOKEN>",
    "uuid": "1239c226-8dd7-4edf-b948-df2f75508888"
  },
  "clientId": "abc12345",
  "clientSecretKey": "thisisasecret"
}

Мне нужно только получить значение token и сохранить его в переменной ... Я буду использовать значение токена в другом вызове curl api в качестве токена носителя.

Что мне нужно изменить в моем скрипте, чтобы извлечь значение token из ответа на вызов curl api?

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 мая 2019

В вашем выражении curl есть ошибка. Вы выполняете его с целевым URL в качестве поля заголовка:

curl --request POST -H "Content-Type:application/json" -H http://acme.com/api/authentications/login --data "${PAYLOAD}"
                                                       ^
                                                       |
                                                   Remove this header flag

Кроме того, флаг молчания -s помогает при выполнении curl из сценариев:

-s, --silent Тихий или тихий режим. Не показывать индикатор прогресса или сообщения об ошибках. Делает Curl немым.

После этого вы можете сохранить данные в переменной и выполнить с ними регулярное выражение для извлечения токена, необходимого для дальнейшей обработки.

Полный сценарий может выглядеть следующим образом:

#!/bin/bash

echo "Extract bearer token from curl calling login api"
echo
# Check cURL command if available (required), abort if does not exists
type curl >/dev/null 2>&1 || { echo >&2 "Required curl but it's not installed. Aborting."; exit 1; }
echo

PAYLOAD='{"email": "dummy-user@acme.com", "password": "secret"}'

RESPONSE=`curl -s --request POST -H "Content-Type:application/json" http://acme.com/api/authentications/login --data "${PAYLOAD}"`

TOKEN=`echo $RESPONSE | grep -Po '"token":(\W+)?"\K[a-zA-Z0-9._]+(?=")`

echo "$TOKEN" # Use for further processsing
0 голосов
/ 21 мая 2019

Альтернативное решение синтаксического анализа JSON с регулярным выражением: jq :

echo '{ "user": { "id": 123, "token": "<GENERATED-TOKEN-HERE>", "email": "dummy-user@acme.com", "refreshToken": "<GENERATED-REFRESH-TOKEN>", "uuid": "1239c226-8dd7-4edf-b948-df2f75508888" }, "clientId": "abc12345", "clientSecretKey": "thisisasecret" }' | jq -r '.user.token'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...