Posted at

PowerShellで、セッションを次のリクエストに渡す方法

More than 1 year has passed since last update.

PowerShellでは、Webのリクエストを実行するコマンドレットがあります。

それらを使う際、セッション情報をリクエストで引き継ぐ方法を書きます。


用途

PowerShellで、ログイン→何らかのリクエスト→ログアウトのような処理をする際、ログインで得たセッションを引き継いで利用する。


対象のコマンドレット

コマンド名
処理
公式

Invoke-WebRequest
ヘッダー等がついた、そのままのHTMLを返す
リンク

Invoke-RestMethod
レスポンスがJSON等なら、その状態で返す
リンク

どちらも、リクエストを実行して、結果を取得する点では共通です。

例として、Invoke-RestMethodを使用しますが、どちらのコマンドレットでも使用できます。


セッションの取得

ログインのAPIを呼び出すとします。下記のURL等は適当で、随時読み替えてください。

また、ログイン処理は、JSONでユーザーID等を渡すものとします。


executor.ps1

# ルートのURL

$hostUrl = "https://hogeService.com/"
# ログインAPIのパス
$login = "rest/login"

$hosturi = New-Object System.Uri ($hostUrl)
$url = New-Object System.Uri ($hosturi, $login)

# ログイン情報
$inputs = @{
username = "userName";
password = "pass";
}

$json = $inputs | ConvertTo-Json;
$headers = @{ #何かあれば }

$res = Invoke-RestMethod -uri $url.AbsoluteUri `
-Method Post `
-Body $json `
-ContentType "application/json" `
-Headers $headers `
-SessionVariable loginSession # loginSessionに、セッション情報が格納される


-SessionVariableを付与し、上記のように書くと、$loginSessionという変数が使えるようになります。これがセッションです。


セッションを使う

次のリクエストに、セッションを付加します。


executor.ps1

# 処理APIのパス

$search = "rest/search"

$url = New-Object System.Uri ($hosturi, $search)

# 検索情報
$inputs = @{
date = Get-Date -Format "yyyy-MM-dd";
title = "hogehoge";
}

$json = $inputs | ConvertTo-Json;

$res = Invoke-RestMethod -uri $url.AbsoluteUri `
-Method Get `
-Body $json `
-ContentType "application/json" `
-Headers $headers `
-WebSession $loginSession


渡すときは、-WebSessionパラメータを使います。


利用上の注意

REST APIを呼び出す場合は、そのAPI仕様をよく見ましょう。

そこに、セッションを渡すとか、ログインの戻り値の一部をヘッダーに含めろ等の指示があると思います。

それを見て、セッションを渡せ、と書いてある場合は、上のようにしてセッションを引き渡しましょう。