外部APIをバッチファイルから叩いてデータを取得できると、監視やインベントリ収集、サードパーティサービス連携などの自動化が一気に進みます。Windows 10以降ならcurl.exeが標準で使えるため、追加ツールなしでHTTP/HTTPSリクエストを送れます。wgetはGit for WindowsやChocolatey等で導入済みであれば同様に活用できます。ここではGETとPOSTの基本、HTTPヘッダーやクエリの扱い、ファイル保存、JSONの取り出し、エラー処理と再試行までを実践的なテンプレートで解説します。
前提と基本の考え方
PowerShellのエイリアスに影響されないように、cmdのバッチでは常にcurl.exeを明示して呼び出すのが安全です。APIの応答がJSONで返るケースが多いため、値の抽出にはPowerShellのConvertFrom-Jsonを併用するとシンプルに書けます。認証が必要なAPIではトークンやキーを平文で残さない方針が重要で、環境変数や資格情報ストアを活用します。
GETリクエストでJSONを取得する基本
最小構成ではURLを指定して結果をファイルに保存します。クエリパラメータはURLエンコード済みで渡し、タイムアウトや冪等な再試行も併せて入れておくと運用が安定します。
@echo off
setlocal EnableDelayedExpansion
set "API=https://api.example.com/v1/items?limit=10&sort=desc"
set "OUT=%~dp0response.json"
rem 10秒タイムアウトでGET、HTTPエラー時にerrorlevel>0を返す(--fail)
curl.exe --silent --show-error --fail --max-time 10 ^
"%API%" ^
-o "%OUT%"
if errorlevel 1 (
echo 取得に失敗しました。ネットワークやエンドポイントを確認してください。
exit /b 1
)
echo 保存完了: "%OUT%"
endlocal
HTTPヘッダーと認証トークンを付与する
多くのAPIはBearerトークンやAPIキーを要求します。ヘッダーを-hや–headerで付け、機密値は環境変数から読むようにします。
@echo off
setlocal
set "API=https://api.example.com/v1/users/me"
set "OUT=%~dp0me.json"
rem 例: 事前に set TOKEN=xxxxx しておく、または cmdkey/Windows資格情報から読み出す設計にする
if "%TOKEN%"=="" (
echo 環境変数 TOKEN が未設定です。
exit /b 1
)
curl.exe --silent --show-error --fail ^
-H "Authorization: Bearer %TOKEN%" ^
-H "Accept: application/json" ^
"%API%" -o "%OUT%"
if errorlevel 1 exit /b 1
echo "%OUT%" にプロフィールを保存しました。
endlocal
POSTでJSONボディを送信する
JSONをPOSTする場合はContent-Typeをapplication/jsonにし、–dataまたは–data-binaryでボディを渡します。長いJSONはファイルに分けると可読性が上がります。
@echo off
setlocal
set "API=https://api.example.com/v1/tickets"
set "BODY=%~dp0ticket.json"
set "OUT=%~dp0ticket_created.json"
> "%BODY%" (
echo {
echo "title": "障害報告",
echo "priority": "high",
echo "description": "詳細な説明をここに"
echo }
)
curl.exe --silent --show-error --fail ^
-H "Authorization: Bearer %TOKEN%" ^
-H "Content-Type: application/json; charset=utf-8" ^
--data-binary "@%BODY%" ^
"%API%" -o "%OUT%"
if errorlevel 1 (
echo 作成APIに失敗しました。
exit /b 1
)
echo 作成結果を "%OUT%" に保存しました。
endlocal
JSONから特定フィールドを抽出する
純バッチだけでJSONを安全にパースするのは困難です。PowerShellのConvertFrom-Jsonを使えば一行で値を取り出せます。
@echo off
setlocal
set "JSON=%~dp0response.json"
set "PS=powershell -NoProfile -Command"
for /f "usebackq delims=" %%V in (`
%PS% "(Get-Content -Raw '%JSON%' ^| ConvertFrom-Json).items[0].id"
`) do set "FIRST_ID=%%V"
echo 最初のID: %FIRST_ID%
endlocal
失敗時の再試行と指数バックオフ
一過性の失敗は数回のリトライで回避できることが多いです。HTTPエラーやタイムアウト時に待機して再度実行します。
@echo off
setlocal EnableDelayedExpansion
set "URL=https://status.example.com/api"
set "OUT=%~dp0status.json"
set /a "MAX_RETRY=5"
set /a "DELAY=2"
for /l %%I in (1,1,%MAX_RETRY%) do (
echo 試行 %%I / %MAX_RETRY% ...
curl.exe --silent --show-error --fail --max-time 10 "%URL%" -o "%OUT%"
if not errorlevel 1 (
echo 成功しました。
goto :OK
)
echo 失敗。%%I 回目。!DELAY! 秒待機します。
timeout /t !DELAY! /nobreak >nul
set /a "DELAY=DELAY*2"
)
echo 規定回数の再試行でも失敗しました。
exit /b 1
:OK
echo 出力: "%OUT%"
endlocal
wgetを使う場合のテンプレート
wgetが導入済みであれば、–headerや–post-data、–tries、–timeoutで同様の挙動を構成できます。curlと異なり–output-documentで保存先を指定します。
@echo off
setlocal
set "URL=https://api.example.com/v1/ping"
set "OUT=%~dp0ping.json"
wget --quiet --tries=3 --timeout=10 ^
--header="Authorization: Bearer %TOKEN%" ^
--header="Accept: application/json" ^
--output-document="%OUT%" ^
"%URL%"
if errorlevel 1 (
echo wgetがエラーを返しました。
exit /b 1
)
echo "%OUT%" を取得しました。
endlocal
ファイルの直接ダウンロードと整合性チェック
バイナリを取得する場合は -L でリダイレクト追従、-oで保存、取得後にハッシュを検証して破損を検出します。
@echo off
setlocal
set "URL=https://downloads.example.com/tool.exe"
set "FILE=%~dp0tool.exe"
set "SHA256_EXPECTED=0123456789abcdef..."
curl.exe -L --fail --show-error --silent "%URL%" -o "%FILE%"
if errorlevel 1 exit /b 1
for /f "tokens=1" %%H in ('certutil -hashfile "%FILE%" SHA256 ^| findstr /r "^[0-9a-fA-F]"') do set "SHA256=%%H"
if /i not "%SHA256%"=="%SHA256_EXPECTED%" (
echo ハッシュ不一致のため中止します。
del "%FILE%" 2>nul
exit /b 1
)
echo 取得と検証が完了しました。
endlocal
プロキシとSSL検証の取り扱い
企業ネットワークではHTTP_PROXYやHTTPS_PROXY環境変数でプロキシを指定することが一般的です。証明書検証を無効化する–insecureは最終手段であり、運用では信頼済みルート証明書の配布で正しく検証を通す設計にします。
@echo off
set "HTTPS_PROXY=http://proxy.local:8080"
curl.exe --fail https://api.example.com/health
安全運用とログの基本設計
APIキーやトークンは環境変数や資格情報管理に置き、ログへ出力しないようにします。成功・失敗の標準出力はファイルへ時刻付きで蓄積し、障害時はレスポンスコードと応答ボディの先頭だけを記録するなど取り扱いを明確化すると監査しやすくなります。
@echo off
setlocal
set "LOG=%~dp0api_%DATE:~0,10%.log"
for /f "tokens=2 delims=: " %%S in ('time /t') do set "T=%%S"
echo [%DATE% %TIME%] /v1/items を取得開始 >> "%LOG%"
curl.exe --write-out "HTTP_CODE=%%{http_code}\n" --silent --show-error --fail ^
"https://api.example.com/v1/items" ^
-o "%~dp0items.json" 1>>"%LOG%" 2>&1
if errorlevel 1 (echo [%DATE% %TIME%] 取得失敗 >> "%LOG%") else (echo [%DATE% %TIME%] 取得成功 >> "%LOG%")
endlocal
まとめ
バッチからのAPI呼び出しはcurl.exeを基軸に据えると導入が容易で、GETやPOST、ヘッダー付与、ファイル保存、再試行まで少ない記述で実現できます。JSONの値抽出はPowerShellを併用して簡潔にし、認証情報は環境変数や資格情報ストアで安全に扱います。プロキシや証明書、ハッシュ検証、ログ設計を最初から織り込んでおけば、日常運用から障害対応まで安定した自動化パイプラインを構築できます。