PowerShellからREST APIを叩くときに便利なInvoke-WebRequest
コマンドレット。だがしかし。
以前にConvertTo-Json
がPowerShell 3.0以降にしか提供されていないという記事を書きましたが、Invoke-WebRequest
もPowerShell 2.0世代にはありません。
今回は.NETのAPIを使って最低限の機能を実現します。.NETでもWebクライアントの実装は色々あるので必要に応じて使い分けて下さい。
GETではReadストリームを、POSTやPUTではJSONデータを送信するため、Writeストリームを使ってJSONデータ(文字列)の送受信を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | function Request-JsonString ($url,$method_str = "GET",$payload_str = "") { # get WebRequest instance $req = [System.Net.WebRequest]::Create($url); $req.ContentType = "application/json"; $method = $method_str.ToUpper(); $req.Method = $method; if (($method -eq "GET") -or ($method -eq "DELETE")) { try { # invoke request and read from stream $reqStream = ($req.GetResponse()).GetResponseStream(); $streamReader = New-Object System.IO.StreamReader $reqStream return $streamReader.ReadToEnd(); } finally { # dispose if got exception if ($streamReader -ne $null) { $streamReader.Dispose(); } if ($reqStream -ne $null) { $reqStream.Dispose(); } } } elseif (($method -eq "POST") -or ($method -eq "PUT")) { try { # build stream writer for web request $reqStream = $req.GetRequestStream(); $streamWriter = New-Object System.IO.StreamWriter $reqStream $streamWriter.Write($payload_str); $streamWriter.Flush(); $streamWriter.Close(); $res = $req.GetResponse(); } finally { if ($streamWriter -ne $null) { $streamWriter.Dispose(); } if ($reqStream -ne $null) { $reqStream.Dispose(); } } } else { throw "Unsupported method: {0}" -f $method; } } |
GETリクエストを送る例はこんな感じ。この場合はJSON文字列が返ってきます。
1 2 3 4 5 | . .\requestJson.ps1 $url = "http://localhost:8080/api/data" $result = Request-JsonString $url "get" Write-Host $result |