Shell脚本通过curl调用API并处理响应

Bor*_*toy 2 shell curl jwt

我需要创建一个通过curl 调用我的登录API 的shell 脚本。该脚本应该能够存储和处理来自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}"
Run Code Online (Sandbox Code Playgroud)

我在给定脚本中的问题是:

  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"
}
Run Code Online (Sandbox Code Playgroud)

我只需要获取 的值token并将其存储在变量中...我将在其他curl api 调用中使用令牌值作为不记名令牌。

我需要在脚本中更改什么才能token从curl api 调用的响应中提取值?

谢谢!

Flo*_*lag 5

你的curl语句有错误。您正在使用目标 URL 作为标头字段来执行它:

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

Also the silent -s flag helps when curl is executed from scripts:

-s, --silent Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

Afterwards you could store the data in a variable and execute a regular expression on it to extract the token you need for further processing.

The complete script could look like the following:

#!/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
Run Code Online (Sandbox Code Playgroud)