外部ファイルの準備
1. 設定ファイル (config.env)
CLIENT_ID=your_client_id
CLIENT_SECRET=your_client_secret
TOKEN_URL=https://example.com/token
API_URL=https://example.com/api
2. ヘッダー設定ファイル (headers.txt)
このファイルはリクエストヘッダーを記述します。
例: Authorization以外の任意のヘッダー
Content-Type: application/json
Custom-Header: CustomValue
3. ボディ設定ファイル (body.json)
リクエストボディはJSON形式で記述します。
{
"key1": "value1",
"key2": "value2"
}
例
#!/bin/bash
# 設定ファイルを読み込む
source config.env
# ヘルパー関数:エラー表示と終了
function error_exit {
echo "Error: $1" >&2
exit 1
}
# 1. Authorizationを取得する
echo "Requesting Authorization Token..."
AUTH_RESPONSE=$(curl -s -w "%{http_code}" -o auth_response.json -X POST \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET" \
-d "grant_type=client_credentials" \
"$TOKEN_URL")
# HTTPステータスコードを取得
HTTP_CODE=$(tail -n1 <<<"$AUTH_RESPONSE")
if [[ "$HTTP_CODE" -ne 200 ]]; then
echo "Failed to retrieve access token. HTTP Code: $HTTP_CODE"
echo "Response:"
cat auth_response.json
rm -f auth_response.json
exit 1
fi
# トークンを抽出
AUTH_TOKEN=$(jq -r '.access_token' < auth_response.json)
if [[ -z "$AUTH_TOKEN" || "$AUTH_TOKEN" == "null" ]]; then
error_exit "Authorization token not found in response."
fi
echo "Authorization Token Retrieved Successfully."
# 2. ヘッダーを読み込む
HEADERS=("-H" "Authorization: Bearer $AUTH_TOKEN")
while IFS= read -r header; do
HEADERS+=("-H" "$header")
done < headers.txt
# 3. ボディを読み込む
if [[ ! -f body.json ]]; then
error_exit "Request body file 'body.json' not found."
fi
BODY=$(cat body.json)
# 4. APIリクエストを送信する
echo "Sending API Request..."
RESPONSE=$(curl -s -w "%{http_code}" -o api_response.json -X POST "${HEADERS[@]}" -d "$BODY" "$API_URL")
# HTTPステータスコードを取得
HTTP_CODE=$(tail -n1 <<<"$RESPONSE")
if [[ "$HTTP_CODE" -ne 200 ]]; then
echo "API request failed. HTTP Code: $HTTP_CODE"
echo "Response:"
cat api_response.json
rm -f api_response.json
exit 1
fi
# 5. レスポンスを表示する
echo "API Request Successful. Response:"
cat api_response.json
# 後片付け
rm -f auth_response.json api_response.json
詳細説明
1. Authorizationの取得
・curl を使って、client_id、client_secret を含むPOSTリクエストを送信し、アクセストークンを取得。
・jq を使用して、レスポンスから access_token を抽出します。
・jq がインストールされていない場合は、sed などで代用できます。
2. ヘッダーの読み込み
・Authorization: Bearer をヘッダーに追加。
・他のヘッダーは headers.txt に記載して管理。
3. リクエストボディの読み込み
・body.json に記述されたJSON形式のデータをそのままPOSTリクエストのボディとして使用。
4. リクエスト送信
・APIのエンドポイント (API_URL) に取得したアクセストークンとヘッダー、ボディを付けてリクエストを送信。
5. レスポンスの表示
・APIからのレスポンスを標準出力に表示。
エラーハンドリングのポイント
1. HTTPステータスコードのチェック
curl の -w "%{http_code}" オプションを使って、リクエストの成功/失敗を確認。
2. トークン取得 (TOKEN_URL) とAPIリクエスト (API_URL) 両方に適用。
HTTPステータスコードが 200 でない場合はエラーとして処理。
3. レスポンスの保存と確認
curl の -o オプションでレスポンスをファイルに保存し、詳細なデバッグが可能。
auth_response.json と api_response.json という一時ファイルを使用。
4. トークン抽出のエラーチェック
jq を使ってトークンを抽出し、空や null の場合はエラーとして終了。
5. ファイル存在チェック
必須ファイル(body.json など)が存在しない場合はエラーメッセージを表示。
6. エラー用ヘルパー関数
error_exit 関数でエラーメッセージを表示し、スクリプトを終了。
7. 一時ファイルのクリーンアップ
処理終了後に一時ファイルを削除して、環境をクリーンに保つ。
実行手順
スクリプトの実行権限を付与します:
chmod +x script.sh
- 成功例
./script.sh
# Output:
# Requesting Authorization Token...
# Authorization Token Retrieved Successfully.
# Sending API Request...
# API Request Successful. Response:
# { "result": "success", "data": { ... } }
- トークン取得失敗
./script.sh
# Output:
# Requesting Authorization Token...
# Failed to retrieve access token. HTTP Code: 401
# Response:
# { "error": "invalid_client", "error_description": "Invalid client credentials" }
- APIリクエスト失敗
./script.sh
# Output:
# Sending API Request...
# API request failed. HTTP Code: 400
# Response:
# { "error": "invalid_request", "message": "Missing required parameters." }
注意点
依存ツール: このスクリプトは jq コマンドを利用しています。