広告 プログラミング

【解説】PowerShellでHTTPアクセス

※本ページには、プロモーション(広告)が含まれています。

悩んでいる人
悩んでいる人

PowerShellでHTTPリクエストを送信する必要が生じた。サンプル事例とともに、使い方を教えて欲しい。

こんなお悩みを解決します。

以前、Raspberry Piを用いてWebサーバを構築しました。

今回は、以前用意したWeb APIをPowerShellを用いて呼び出す方法を紹介します。

以前実装した結果は、以下の記事を参考にしてください。

あわせて読みたい
【解説】Node.jsによるWebサーバ構築

続きを見る

一昔前と比較して、Windowsで実施できることも増えているのでこれを機にPowerShellの勉強をしても良いかもしれませんね。

通信方法

リクエスト内容とレスポンス内容を簡単におさらいしておきます。

Node-Redでエンドポイントを設定していたので、そこにHTTPリクエストを出す形となります。

リクエストとレスポンス

それぞれ、以下のような対応になります。

項目説明
urlアクセス先のURLhttp://raspberrypi.local:1880/light
Content-TypeHTTPリクエストを出す際のContent-Type
今回はapplication/jsonを利用します
Content-Type: "application/json"
MethodHTTPリクエストで用いるmethod
今回はPOSTを利用します
Method: POST
DataPOSTリクエスト時にbodyに埋め込むデータ{"command": "on"}
各項目の説明

PowerShellのスクリプトを作成

PowerShellでHTTPアクセスする際のロジックを示したいと思います。

PowerShellでHTTPアクセスする際のロジック3ステップ

  1. HTTPリクエストのためのオブジェクトを用意
  2. Invoke-WebRequestコマンドでリクエストを送信
  3. レスポンスを解析・結果を出力

上記の内容に合わせて実装した結果は、以下のようになります。

# ホスト名とポート番号の設定
$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.ps1wrapper.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で操作する方法を紹介したいと思います。

スポンサードリンク



-プログラミング
-,