PowerShellでHTTPリクエストを送信する必要が生じた。サンプル事例とともに、使い方を教えて欲しい。
こんなお悩みを解決します。
以前、Raspberry Piを用いてWebサーバを構築しました。
今回は、以前用意したWeb APIをPowerShellを用いて呼び出す方法を紹介します。
以前実装した結果は、以下の記事を参考にしてください。
【解説】Node.jsによるWebサーバ構築
続きを見る
一昔前と比較して、Windowsで実施できることも増えているのでこれを機にPowerShellの勉強をしても良いかもしれませんね。
通信方法
リクエスト内容とレスポンス内容を簡単におさらいしておきます。
Node-Redでエンドポイントを設定していたので、そこにHTTPリクエストを出す形となります。
それぞれ、以下のような対応になります。
項目 | 説明 | 例 |
---|---|---|
url | アクセス先のURL | http://raspberrypi.local:1880/light |
Content-Type | HTTPリクエストを出す際のContent-Type 今回はapplication/jsonを利用します | Content-Type: "application/json" |
Method | HTTPリクエストで用いるmethod 今回はPOSTを利用します | Method: POST |
Data | POSTリクエスト時にbodyに埋め込むデータ | {"command": "on"} |
PowerShellのスクリプトを作成
PowerShellでHTTPアクセスする際のロジックを示したいと思います。
PowerShellでHTTPアクセスする際のロジック3ステップ
- HTTPリクエストのためのオブジェクトを用意
- Invoke-WebRequestコマンドでリクエストを送信
- レスポンスを解析・結果を出力
上記の内容に合わせて実装した結果は、以下のようになります。
# ホスト名とポート番号の設定
$hostname = 'raspberrypi.local'
$port = 1880
# リクエストの内容
$link = 'light'
$params = ConvertTo-Json @{
"payload" = "on"
}
# WebAPI
$request = 'http://{0}:{1}/{2}' -f ($hostname, $port, $link)
$uri = New-Object System.Uri $request
$response = Invoke-WebRequest -Uri $uri -Method POST -ContentType 'application/json' -Body $params
# Status Codeの確認
if ($response.StatusCode -eq 200) {
$message = [String]::new($response.Content)
Write-Host $message
}
また、実行時の手間を省くため、上記のコードをhttp_access.ps1
という名前で保存し、以下を記載したbatファイルwrappter.bat
から呼び出します。
ここで、http_access.ps1
とwrapper.bat
は同じ階層のディレクトリ内に格納されているものとします。
@echo off
cd /d %~dp0
powershell -ExecutionPolicy Unrestricted .\http_access.ps1
実行すると以下のような結果が得られます。
解説
PowerShellのコードとMS-DOSのコードの解説を行っていきます。
PowerShellのコード
まず、1行目から8行目の部分でアクセスするサーバの設定を行います。
# ホスト名とポート番号の設定
$hostname = 'raspberrypi.local'
$port = 1880
# リクエストの内容
$link = 'light'
$params = ConvertTo-Json @{
"payload" = "on"
}
ここで、hostnameとportはご自身の環境に合わせて変更が必要となります。
今回は、私のアカウントで公開しているGitHubの実装をもとに設定しています。
また、実行するコマンドは「照明(light)をONにする」という内容になります。
次に、9行目から14行目で実際にHTTPリクエストを出します。
# WebAPI
$request = 'http://{0}:{1}/{2}' -f ($hostname, $port, $link)
$uri = New-Object System.Uri $request
$response = Invoke-WebRequest -Uri $uri -Method POST -ContentType 'application/json' -Body $params
それぞれ、以下のような対応になります。
- 11行目:エンドポイントの設定
- 12行目:URIオブジェクトの生成
- 13行目:Method、Content-Type、送信するデータ(Body)を設定し、リクエストを送信
13行目の戻り値がレスポンスとなります。
最後に、ステータスコードを確認し、返却されたデータを画面に出力します。
# Status Codeの確認
if ($response.StatusCode -eq 200) {
$message = [String]::new($response.Content)
Write-Host $message
}
今回は、レスポンスが文字列だったためそのまま出力していますが、レスポンスがJSONデータの場合、以下の手順でJSONデータの内容を取得できます。
$json_data = ConvertFrom-Json $([String]::new($response.Content))
MS-DOSのコード
PowerShellは、初期設定のままでは実行権限ポリシーの都合上、スクリプトファイル(.ps1のファイル)を実行できません。
このため、実行するには実行権限ポリシーを変更する必要があります。
ただ、常にスクリプトファイルが実行できる状態はセキュリティ上好ましくないです。このため、実行時のみ権限を変更する方法を採用します。
コード自体はシンプルで、実行時の引数にオプションを指定することで対応できます。batファイルの4行目が該当します。
rem 実行権限ポリシーを「Unrestricted」として実行
powershell -ExecutionPolicy Unrestricted .\http_access.ps1
PowerShellを利用して作業を効率化しよう!
今回は、PowerShellを用いてHTTPリクエストを送信する方法を解説しました。
これを応用すれば、Windows上でWebAPIのテストができるようになるため、普段、Web関係の開発を行っている方は、どこかで役に立つ可能性があります。
今回はWeb系でしたが、Microsoftが開発しているアプリケーションとも親和性が高いので、普段GUIで操作する作業も、一部PowerShellで自動化できます。
私は、Excel VBAのことはよく知らなかったですが、PowerShellによる自動化で効率良く作業できた経験があります。
次回は、普段使われているExcelをPowerShellで操作する方法を紹介したいと思います。