PowerShell

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

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仕様をよく見ましょう。
そこに、セッションを渡すとか、ログインの戻り値の一部をヘッダーに含めろ等の指示があると思います。
それを見て、セッションを渡せ、と書いてある場合は、上のようにしてセッションを引き渡しましょう。