はじめに:バッチファイルからAPIを呼び出す方法
Windows環境でバッチファイル(.bat)を使って定期的なデータ取得や通知送信を自動化したい場面は多くあります。本記事では curl.exe と wget を使って、REST APIへのリクエストをバッチファイルから行う方法を体系的に解説します。
この記事で学べること
curl.exe でのGET / POST / 認証付きAPIリクエスト
JSONレスポンスの保存・PowerShellでの値抽出
エラーハンドリング・リトライ処理
wget の導入とファイルダウンロード
プロキシ・SSL対応とセキュリティ設計
天気API・Slack通知の実践テンプレート
curl.exe と wget の概要
curl.exe は Windows 10 バージョン 1803(2018年)以降、OS標準で搭載されたHTTPクライアントです。追加インストール不要でバッチから即座に利用できます。一方 wget は GNU プロジェクトのダウンロードツールで、ミラーリングや再帰ダウンロードに強みがあります。どちらもAPIコールの用途に使えますが、REST APIを扱う場面では curl.exe が主流です。
ツール
Windows標準
主な用途
JSONの扱い
curl.exe
Win10 1803以降 標準搭載
REST API呼び出し全般
オプションで送受信可能
wget
別途インストール必要
ファイルダウンロード・ミラー
受信は可能
PowerShell
標準搭載(Win7以降)
JSON解析・複雑な処理
ConvertFrom-Json で完全対応
注意: Windows 7/8.1では curl.exe が標準搭載されていません。これらの環境では別途 curl をダウンロードするか、PowerShell の Invoke-WebRequest を利用してください。
curl.exe 基礎 – GETリクエスト
まずは最もシンプルなGETリクエストから始めましょう。コマンドプロンプト(cmd)で直接実行することも、バッチファイルに記述することもできます。
基本構文
コマンドプロンプト / バッチファイル
REM GETリクエストの基本
curl "https:// api.example.com/data"
REM レスポンスボディのみ表示(進捗バー非表示)
curl -s "https:// api.example.com/data"
REM ヘッダーも含めて表示
curl -i "https:// api.example.com/data"
REM 詳細情報(デバッグ用)
curl -v "https:// api.example.com/data"
バッチファイルでのGETリクエスト
get_request.bat
@echo off
setlocal
set API_URL =https:// jsonplaceholder.typicode.com/todos/1
REM APIにGETリクエストを送信
curl -s %API_URL%
echo .
echo 完了
endlocal
ポイント: @echo off をファイル先頭に記述することで、実行コマンド自体がコンソールに表示されなくなります。デバッグ中は @echo on に変えて確認しましょう。
レスポンスの保存と確認方法
APIのレスポンスをファイルに保存すると、後続処理での解析や、ログとしての保持が容易になります。
save_response.bat
@echo off
setlocal
set API_URL =https:// jsonplaceholder.typicode.com/posts/1
set OUTPUT_FILE =response.json
REM レスポンスをファイルに保存(-o オプション)
curl -s -o %OUTPUT_FILE% %API_URL%
REM ステータスコードのみ取得
for /f "delims=" %%i in ('curl -s -o NUL -w "%%{http_code}" %API_URL%' ) do set HTTP_CODE =%%i
echo HTTPステータスコード: %HTTP_CODE%
echo レスポンスを %OUTPUT_FILE% に保存しました
REM ファイル内容を確認
type %OUTPUT_FILE%
endlocal
-w "%{http_code}" オプションでHTTPステータスコードを変数に取り込めます。200番台なら成功、400・500番台はエラーとして後続処理を分岐させるのが定石です。
curl オプション
意味
使用場面
-s
サイレントモード(進捗表示なし)
バッチ処理時は常に推奨
-o ファイル名
レスポンスをファイルに保存
JSON解析・ログ保存
-w "%{http_code}"
ステータスコードを出力
エラー判定
-D ファイル名
レスポンスヘッダーをファイルに保存
Cookie・トークン取得
--max-time 秒数
タイムアウト設定(全体)
ハング防止
--connect-timeout 秒数
接続タイムアウト
DNS/接続遅延対策
HTTPヘッダーと認証(Bearer / APIキー)
多くのAPIはアクセストークンやAPIキーによる認証を必要とします。curl.exe では -H オプションでカスタムヘッダーを付加できます。
Bearer トークン認証
bearer_auth.bat
@echo off
setlocal
set TOKEN =your_access_token_here
set API_URL =https:// api.example.com/protected/data
REM Bearer トークン認証
curl -s -H "Authorization: Bearer %TOKEN% " %API_URL%
endlocal
APIキー認証(ヘッダー方式)
apikey_auth.bat
@echo off
setlocal
set API_KEY =your_api_key_here
set API_URL =https:// api.example.com/data
REM X-API-Key ヘッダーでAPIキーを送信
curl -s -H "X-API-Key: %API_KEY% " -H "Accept: application/json" %API_URL%
REM Basic認証(ユーザー名:パスワード)
curl -s -u "username:password" %API_URL%
endlocal
注意: APIキーやトークンをバッチファイルにハードコードするのはセキュリティリスクです。環境変数ファイル(.env)から読み込む方式や、Windowsの資格情報マネージャーを利用することを推奨します。詳細はセキュリティセクションで解説します。
POSTリクエスト(JSONボディ送信)
データを送信する場合はPOSTメソッドを使います。APIの多くはリクエストボディにJSON形式のデータを期待します。
インラインJSONでのPOST
post_json.bat
@echo off
setlocal
set API_URL =https:// jsonplaceholder.typicode.com/posts
REM JSONボディをインラインで指定
curl -s -X POST ^
-H "Content-Type: application/json" ^
-d "{"title":"テスト投稿","body":"本文内容","userId":1}" ^
%API_URL%
endlocal
JSONファイルからのPOST(推奨)
複雑なJSONボディはファイルに書いておくとエスケープの手間が省けます。
request_body.json
{
"title" : "バッチからのテスト投稿" ,
"body" : "バッチファイルからAPIを呼び出しています" ,
"userId" : 1
}
post_from_file.bat
@echo off
setlocal
set API_URL =https:// jsonplaceholder.typicode.com/posts
set BODY_FILE =request_body.json
REM JSONファイルからボディを読み込む(@ プレフィックスを使用)
curl -s -X POST ^
-H "Content-Type: application/json" ^
-d "@%BODY_FILE% " ^
%API_URL%
endlocal
ポイント: -d "@ファイル名" の @ はファイルからデータを読み込む指示です。バッチファイル内でJSONを直接書く場合、ダブルクォートを " でエスケープする必要があります。ファイル方式ならエスケープ不要で管理も楽になります。
クエリパラメータとURLエンコード
GETリクエストでは検索条件などをURLのクエリパラメータとして付加します。日本語や特殊文字はURLエンコードが必要な場合があります。
query_params.bat
@echo off
setlocal
REM クエリパラメータをURLに直接記述
curl -s "https:// jsonplaceholder.typicode.com/posts?userId=1&_limit=5"
REM --data-urlencode でURLエンコードを自動処理(GETの場合は -G と併用)
curl -s -G ^
--data-urlencode "keyword=バッチファイル" ^
--data-urlencode "page=1" ^
"https:// api.example.com/search"
REM 変数を使う場合
set USER_ID =1
set LIMIT =10
curl -s "https:// jsonplaceholder.typicode.com/posts?userId=%USER_ID% &_limit=%LIMIT% "
endlocal
JSONレスポンスから値を抽出する(PowerShell ConvertFrom-Json)
バッチファイル単体ではJSONを解析する機能がないため、PowerShellを呼び出して値を抽出する方法が最も実用的です。
特定フィールドの抽出
extract_json.bat
@echo off
setlocal
set API_URL =https:// jsonplaceholder.typicode.com/todos/1
REM レスポンスをファイルに保存
curl -s -o response.json %API_URL%
REM PowerShellでJSONを解析してフィールドを取得
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content response.json | ConvertFrom-Json).title"' ) do set TITLE =%%i
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content response.json | ConvertFrom-Json).completed"' ) do set COMPLETED =%%i
echo タイトル: %TITLE%
echo 完了状態: %COMPLETED%
endlocal
ネストしたJSONフィールドの抽出
extract_nested.bat
@echo off
setlocal
REM ネストしたフィールドはドット記法でアクセス
REM 例: {"user": {"name": "Taro", "age": 30}}
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content response.json | ConvertFrom-Json).user.name"' ) do set USER_NAME =%%i
REM 配列の最初の要素
REM 例: {"items": [{"id": 1, "name": "A"}]}
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content response.json | ConvertFrom-Json).items[0].name"' ) do set ITEM_NAME =%%i
echo ユーザー名: %USER_NAME%
echo アイテム名: %ITEM_NAME%
endlocal
PowerShell JSON抽出チートシート
.field → 単一フィールド取得
.parent.child → ネストフィールド取得
.array[0] → 配列の要素取得
.array.Count → 配列の要素数
($json | Select-Object -ExpandProperty field) → 代替構文
($json.items | Where-Object {$_.id -eq 1}).name → 条件フィルタ
エラー処理と errorlevel の扱い
バッチファイルでAPIを呼び出す際、ネットワークエラーやHTTPエラーへの対処が欠かせません。curl.exe は終了コード(errorlevel)でエラーを通知します。
curl の終了コード一覧
終了コード
意味
主な原因
0
成功
正常完了
6
ホスト名解決失敗
DNS エラー・ネットワーク未接続
7
接続失敗
サーバーダウン・ポート番号誤り
22
HTTP エラー
-f オプション使用時の 4xx/5xx エラー
28
タイムアウト
--max-time の時間超過
35
SSL接続エラー
証明書エラー・プロトコル不一致
60
SSL証明書検証失敗
自己署名証明書・期限切れ
エラーハンドリングの実装
error_handling.bat
@echo off
setlocal
set API_URL =https:// api.example.com/data
REM -f オプション: HTTPエラーで終了コード22を返す
curl -s -f -o response.json %API_URL%
REM curl の終了コードを確認
if errorlevel 1 goto :ERROR
REM HTTPステータスコードも確認
for /f "delims=" %%i in ('curl -s -o NUL -w "%%{http_code}" %API_URL%' ) do set HTTP_CODE =%%i
if %HTTP_CODE% NEQ 200 goto :HTTP_ERROR
echo API呼び出し成功(HTTP %HTTP_CODE% )
goto :END
:ERROR
echo エラー: curl の実行に失敗しました(ネットワークエラーの可能性)
exit /b 1
:HTTP_ERROR
echo エラー: HTTPステータスコード %HTTP_CODE%
exit /b 1
:END
endlocal
リトライ処理と指数バックオフ
ネットワークの一時的な不安定やAPIのレート制限(Rate Limiting)に備えて、リトライ処理を実装するのがベストプラクティスです。指数バックオフ(Exponential Backoff)は、リトライのたびに待機時間を増やすことで、サーバー負荷を軽減します。
retry_with_backoff.bat
@echo off
setlocal enabledelayedexpansion
set API_URL =https:// api.example.com/data
set MAX_RETRY =3
set RETRY_COUNT =0
set WAIT_SEC =2
:RETRY_LOOP
set /a RETRY_COUNT +=1
echo 試行 !RETRY_COUNT! / %MAX_RETRY%
curl -s -f --max-time 30 -o response.json %API_URL%
if not errorlevel 1 goto :SUCCESS
if !RETRY_COUNT! GEQ %MAX_RETRY% goto :FAILED
echo 失敗。 !WAIT_SEC! 秒後にリトライします...
timeout /t !WAIT_SEC! /nobreak > nul
REM 指数バックオフ(待機時間を2倍に)
set /a WAIT_SEC =!WAIT_SEC! *2
goto :RETRY_LOOP
:SUCCESS
echo API呼び出し成功
goto :END
:FAILED
echo エラー: %MAX_RETRY% 回の試行がすべて失敗しました
exit /b 1
:END
endlocal
ポイント: setlocal enabledelayedexpansion と !変数名! を使うことで、ループ内での変数値の更新が反映されます。通常の %変数名% はブロック実行時に一度だけ展開されるため、ループ内では正しい値が得られない場合があります。
wget を使う方法
wget は Windows には標準搭載されていませんが、GNU の公式サイトやパッケージマネージャーからインストールできます。ファイルダウンロードやミラーリングに特化した豊富なオプションを持っています。
インストール方法
方法
コマンド / 手順
特徴
Winget
winget install GnuWin32.Wget
Windows 10/11 なら推奨
Chocolatey
choco install wget
Choco 導入済み環境向け
Scoop
scoop install wget
管理者権限不要
手動インストール
gnuwin32.sourceforge.net からダウンロード
インターネット環境があれば可
wget の基本的なAPIコール
wget_basic.bat
@echo off
setlocal
REM GETリクエストとファイル保存
wget -q -O response.json https:// jsonplaceholder.typicode.com/todos/1
REM ヘッダーを追加(--header オプション)
wget -q -O response.json ^
--header ="Authorization: Bearer your_token" ^
--header ="Accept: application/json" ^
https:// api.example.com/data
REM POST リクエスト
wget -q -O response.json ^
--post-data ='{"key":"value"}' ^
--header ="Content-Type: application/json" ^
https:// api.example.com/post
REM タイムアウト設定
wget -q -O response.json --timeout =30 --tries =3 https:// api.example.com/data
endlocal
ファイルダウンロードとSHA256検証
バッチファイルを使ってファイルをダウンロードし、整合性をSHA256ハッシュで検証するパターンは、自動更新スクリプトやCI/CD環境で頻繁に使われます。
download_and_verify.bat
@echo off
setlocal
set DOWNLOAD_URL =https:// example.com/software-v1.0.zip
set OUTPUT_FILE =software-v1.0.zip
set EXPECTED_HASH =abc123def456...(公式サイトに記載されているSHA256)
REM ファイルをダウンロード
curl -s -L -o %OUTPUT_FILE% %DOWNLOAD_URL%
if errorlevel 1 (echo ダウンロード失敗 & exit /b 1 )
REM SHA256ハッシュを計算(certutil コマンドを使用)
for /f "skip=1 tokens=* delims=" %%i in ('certutil -hashfile %OUTPUT_FILE% SHA256' ) do (
if "%%i" NEQ "CertUtil: -hashfile コマンドは正常に完了しました。" (
set ACTUAL_HASH =%%i
)
)
REM ハッシュを比較(スペースを削除して比較)
set ACTUAL_HASH =%ACTUAL_HASH: =%
if /i "%ACTUAL_HASH% " =="%EXPECTED_HASH% " (
echo ハッシュ検証成功: ファイルは正常です
) else (
echo エラー: ハッシュが一致しません。ファイルが破損しているか改ざんされた可能性があります
del %OUTPUT_FILE%
exit /b 1
)
endlocal
ポイント: Windows 標準の certutil -hashfile コマンドを使えば、外部ツール不要でSHA256、MD5、SHA1などのハッシュを計算できます。-L オプションはリダイレクト(301/302)に自動追従するためのものです。
プロキシ環境での設定
社内ネットワークなどプロキシが必要な環境では、curl と wget それぞれにプロキシ設定が必要です。
proxy_settings.bat
@echo off
setlocal
set PROXY_HOST =proxy.company.com
set PROXY_PORT =8080
set PROXY_USER =username
set PROXY_PASS =password
REM curl でプロキシを指定
curl -s -x %PROXY_HOST% :%PROXY_PORT% -U %PROXY_USER% :%PROXY_PASS% https:// api.example.com/data
REM 環境変数でプロキシを設定(curl が自動認識)
set HTTP_PROXY =http:// %PROXY_USER% :%PROXY_PASS% @%PROXY_HOST% :%PROXY_PORT%
set HTTPS_PROXY =https:// %PROXY_USER% :%PROXY_PASS% @%PROXY_HOST% :%PROXY_PORT%
curl -s https:// api.example.com/data
REM プロキシをスキップするホスト(NO_PROXY)
set NO_PROXY =localhost,127.0.0.1,.local
REM wget でプロキシを指定
wget -q -O response.json ^
-e "http_proxy=http:// %PROXY_USER% :%PROXY_PASS% @%PROXY_HOST% :%PROXY_PORT% " ^
https:// api.example.com/data
endlocal
SSL証明書エラーの対処法
開発環境や社内システムでは自己署名証明書(オレオレ証明書)が使われることがあります。その場合、SSL検証エラーが発生しますが、適切な対処法を選択することが重要です。
証明書エラーの種類と対処法
エラー種別
対処法
推奨度
自己署名証明書
--cacert で証明書ファイルを指定
推奨
期限切れ証明書
管理者に更新を依頼
根本対処
テスト環境のみ
-k / --insecure で検証スキップ
開発時のみ
中間CA証明書不足
--cacert でCA束ファイルを指定
推奨
ssl_handling.bat
@echo off
setlocal
REM 推奨: 自己署名証明書ファイルを指定
curl -s --cacert ./certs/custom_ca.crt https:// internal.company.com/api
REM 開発・テスト用のみ: SSL検証を無効化(本番では絶対に使わない)
curl -s -k https:// dev.internal.local/api
REM Windows の信頼済み証明書ストアを使う方法
curl -s --ssl-no-revoke https:// api.example.com/data
REM wget での SSL スキップ(テスト用のみ)
wget -q --no-check-certificate -O response.json https:// dev.internal.local/api
endlocal
注意: -k / --insecure は中間者攻撃(MITM)のリスクがあります。本番環境や機密データを扱うAPIには絶対に使用しないでください。開発環境でのみ一時的に使用し、運用に移す前に必ず --cacert に切り替えてください。
実践テンプレート:天気API取得バッチ(OpenWeatherMap想定)
OpenWeatherMap の無料APIを使って、現在の天気情報を取得・表示するバッチファイルの完全なテンプレートです。同様のパターンで他のAPIにも応用できます。
get_weather.bat
@echo off
setlocal enabledelayedexpansion
REM ========================================
REM 天気情報取得バッチ(OpenWeatherMap API)
REM ========================================
set API_KEY =your_openweathermap_api_key
set CITY =Tokyo
set UNITS =metric
set LANG =ja
set LOG_FILE =weather_log.txt
set TEMP_FILE =weather_response.json
REM タイムスタンプ取得
for /f "delims=" %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd_HH:mm:ss"' ) do set TIMESTAMP =%%i
echo [ %TIMESTAMP% ] 天気情報を取得中...
REM APIリクエスト(リトライ付き)
set RETRY =0
:WEATHER_RETRY
set /a RETRY +=1
curl -s -f --max-time 15 -o %TEMP_FILE% ^
"https:// api.openweathermap.org/data/2.5/weather?q=%CITY% &appid=%API_KEY% &units=%UNITS% &lang=%LANG% "
if errorlevel 1 (
if !RETRY! LSS 3 (
echo リクエスト失敗。リトライします...
timeout /t 5 /nobreak > nul
goto :WEATHER_RETRY
)
echo エラー: APIリクエストに失敗しました >> %LOG_FILE%
exit /b 1
)
REM JSONから天気情報を抽出
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content weather_response.json | ConvertFrom-Json).main.temp"' ) do set TEMP =%%i
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content weather_response.json | ConvertFrom-Json).weather[0].description"' ) do set DESCRIPTION =%%i
for /f "delims=" %%i in ('powershell -NoProfile -Command "(Get-Content weather_response.json | ConvertFrom-Json).main.humidity"' ) do set HUMIDITY =%%i
REM 結果表示とログ出力
echo ==========================
echo 都市: %CITY%
echo 気温: %TEMP% ℃
echo 天候: %DESCRIPTION%
echo 湿度: %HUMIDITY% %%
echo ==========================
REM ログファイルに書き込み
echo [ %TIMESTAMP% ] %CITY% : %TEMP% ℃, %DESCRIPTION% , 湿度 %HUMIDITY% %% >> %LOG_FILE%
REM 一時ファイルを削除
del %TEMP_FILE%
endlocal
実践テンプレート:Slack通知バッチ
Slackの Incoming Webhook を使ってバッチファイルから通知を送信するテンプレートです。バッチ処理の完了通知やエラーアラートとして広く使われています。
slack_notify.bat
@echo off
setlocal
REM ========================================
REM Slack Incoming Webhook 通知バッチ
REM ========================================
set WEBHOOK_URL =https:// hooks.slack.com/services/T00000000/B00000000/xxxxxxxxxxxxxxxxxxxxxxxx
set CHANNEL =#notifications
set MESSAGE =バッチ処理が完了しました
REM シンプルな通知
curl -s -X POST ^
-H "Content-Type: application/json" ^
-d "{"text":"%MESSAGE% "}" ^
%WEBHOOK_URL%
echo .
echo Slack通知を送信しました
endlocal
リッチなSlack通知(Block Kit使用)
slack_rich_notify.bat
@echo off
setlocal
set WEBHOOK_URL =https:// hooks.slack.com/services/xxx/yyy/zzz
REM JSONをファイルに書き出してから送信(日本語対応・複雑なメッセージ向け)
(
echo {
echo "text": "バッチ処理完了レポート" ,
echo "blocks" : [
echo {
echo "type" : "header" ,
echo "text" : {"type" : "plain_text" , "text" : "✅ バッチ処理完了" }
echo },
echo {
echo "type" : "section" ,
echo "text" : {"type" : "mrkdwn" , "text" : "*処理名:* データ同期
*件数:* 1,234件
*所要時間:* 3分45秒" }
echo }
echo ]
echo }
) > slack_payload.json
curl -s -X POST ^
-H "Content-Type: application/json" ^
-d "@slack_payload.json" ^
%WEBHOOK_URL%
del slack_payload.json
endlocal
Slack Webhook の設定手順
Slack App の設定ページ(api.slack.com/apps )にアクセス
「Create New App」→「From scratch」を選択
「Incoming Webhooks」を有効化
「Add New Webhook to Workspace」で対象チャンネルを選択
生成されたWebhook URLをバッチファイルに設定
ログ設計とセキュリティのベストプラクティス
API呼び出しバッチを本番運用する際には、ログ設計とセキュリティ対策が欠かせません。
ログ設計テンプレート
api_with_logging.bat
@echo off
setlocal enabledelayedexpansion
REM ログファイルの設定(日付でローテーション)
for /f "delims=" %%d in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"' ) do set DATE =%%d
set LOG_FILE =logsapi_log_%DATE% .txt
REM ログディレクトリ作成
if not exist logs mkdir logs
REM ログ出力関数(擬似)
for /f "delims=" %%t in ('powershell -NoProfile -Command "Get-Date -Format HH:mm:ss"' ) do set TIME_NOW =%%t
echo [ %DATE% %TIME_NOW% ] [INFO] API呼び出し開始 >> %LOG_FILE%
set API_URL =https:// api.example.com/data
curl -s -f --max-time 30 ^
-o response.json ^
-w "HTTP_CODE:%%{http_code} TIME:%%{time_total}" ^
%API_URL% >> %LOG_FILE%
if errorlevel 1 (
echo [ %DATE% %TIME_NOW% ] [ERROR] API呼び出し失敗 >> %LOG_FILE%
exit /b 1
)
echo [ %DATE% %TIME_NOW% ] [INFO] 処理完了 >> %LOG_FILE%
endlocal
セキュリティのベストプラクティス
セキュリティ チェックリスト
APIキーのハードコード禁止 → 環境変数ファイル(.env)または Windows 資格情報マネージャーを使用
ログにシークレットを出力しない → curlの -v オプションを本番で使わない
HTTPS必須 → HTTP(平文)でのAPIコールは機密情報漏洩リスクあり
--insecure は開発環境のみ → 本番では証明書を正しく設定
一時ファイルを必ず削除 → response.jsonなどにトークンが含まれる場合
ログファイルのアクセス権限設定 → 機密情報が含まれる場合は適切に管理
環境変数ファイルからAPIキーを読み込む
.env ファイル(Git管理外に置くこと)
API_KEY =your_secret_api_key
WEBHOOK_URL =https:// hooks.slack.com/services/xxx/yyy/zzz
load_env.bat(.envファイルを読み込む)
@echo off
setlocal
REM .env ファイルから環境変数を読み込む
for /f "usebackq tokens=1,* delims==" %%a in (".env" ) do (
if not "%%a" =="" set %%a =%%b
)
REM 読み込んだAPIキーを使用
curl -s -H "Authorization: Bearer %API_KEY% " https:// api.example.com/data
endlocal
よくある質問(FAQ)
Q. バッチファイルからAPIを呼び出すにはcurlとwgetどちらがよいですか?
A. Windows 10(バージョン1803以降)にはcurl.exeが標準搭載されているため、バッチからはcurlが手軽です。curl -s -X GET "https://api.example.com/data" -o output.jsonのように使います。wgetはWindowsに標準搭載されていないため別途インストールが必要です。
Q. curlで取得したAPIレスポンス(JSON)をバッチファイルで処理するにはどうすればよいですか?
A. バッチファイル自体はJSON解析が苦手です。PowerShellを呼び出す方法が実用的です:powershell -Command "(Get-Content response.json | ConvertFrom-Json).field"。または、JQなどの外部ツール(jq.exe)をインストールしてjsonをパースする方法もあります。
Q. APIのアクセストークン(Bearer認証)はどのように渡しますか?
A. curlでは-H "Authorization: Bearer YOUR_TOKEN"オプションでヘッダーを追加します。トークンは環境変数に保存して-H "Authorization: Bearer %TOKEN%"のように参照することで、スクリプトにトークンをハードコードせに済みます。
まとめ
バッチファイルから curl.exe や wget を使ってAPIを呼び出す方法について、基本から実践テンプレートまで解説しました。
この記事のまとめ
curl.exe は Windows 10 1803以降に標準搭載。GET/POST/認証ヘッダーに完全対応
レスポンスの保存 は -o ファイル名、ステータスコード取得は -w "%{http_code}"
JSON解析 は PowerShell の ConvertFrom-Json と組み合わせるのが最も実用的
エラーハンドリング は errorlevel + HTTPステータスコードの二段構えで確実に
リトライ処理 は setlocal enabledelayedexpansion + 指数バックオフで実装
セキュリティ は APIキーをハードコードせず、.envファイルや環境変数で管理
本番運用 では必ずログ設計とエラー通知(Slack等)を組み込む
基本パターンを習得したら、タスクスケジューラと組み合わせて定期実行バッチとして使うと、自動化の幅が大きく広がります。ぜひ自身の業務自動化に活用してみてください。
関連するまとめページ