ひょんなことからPowerShellを利用してAPI関連のプログラムを行うことになった。
その内容はSOAPを利用してxml形式でデータをやり取りすること。
SOAPはxmlを利用して外部とのやり取りを行う。
まず、なぜPowerShellでSOAPを利用するのか?
理由1:PowerShellはWindows環境(最近少し状況は変わってきているが)であれば、
ほぼインストール不要で最初からWindowsにバンドルされていること。
理由2:PowerShellのxmlの取扱いが非常に便利であること。
また、豊富なテキスト処理コマンドで非常にデータを取り扱いやすいこと。
理由3:バッチなどからスクリプトを起動し、簡易に自動実行に組み込めること。
また、スクリプト形式なのでコンパイル不要。メチャクチャ楽。
以上の理由から私はPowerShellを選択した。
では実際にはどう実装するのか?非常に悩ましかったが、
以下のサイトよりSOAPの基礎通信部分がそのまま配布されていた。
Execute a SOAP request from Powershell
function Execute-SOAPRequest
(
[Xml] $SOAPRequest,
[String] $URL
)
{
#通信設定
write-host "Sending SOAP Request To Server: $URL"
$soapWebRequest = [System.Net.WebRequest]::Create($URL)
$soapWebRequest.Headers.Add("SOAPAction","`"`"")
$soapWebRequest.ContentType = "text/xml;charset=`"utf-8`""
$soapWebRequest.Accept = "text/xml"
$soapWebRequest.Method = "POST"
#リクエスト送信
write-host "Initiating Send."
$requestStream = $soapWebRequest.GetRequestStream()
$SOAPRequest.Save($requestStream)
$requestStream.Close()
#レスポンス獲得
write-host "Send Complete, Waiting For Response."
$resp = $soapWebRequest.GetResponse()
$responseStream = $resp.GetResponseStream()
$soapReader = [System.IO.StreamReader]($responseStream)
$ReturnXml = [Xml] $soapReader.ReadToEnd()
$responseStream.Close()
write-host "Response Received."
return $ReturnXml
}
#呼び出し
$xml = Execute-SOAPRequest $soap $url
ほぼ、そのままで使える関数と思われる。
あとは末尾の呼び出しにSOAP用のリクエストを、
xml形式で$soapの変数に格納し、
SOAPリクエストを受け付けているアドレスを$urlに格納する。
最初に気になったのはセキュリティ面であった。
HTTPSリクエストを行った場合、きちんと暗号化されて送信されているか?
そこが問題となったが、以下の資料があった。
Secure Sockets Layerの使用
上記のコード内では.NETのWebRequestを利用しているので、
おそらく大丈夫じゃないかなと思う。
最初はPowerShellの機能だけで完結できないかと苦戦した。
Invoke-RestMethod や Invoke-WebRequest を利用しようと考えたが、
UTF-8の文字コードやなんやらの関係でうまくいかなかった。
その時に見つけたのが上記のコードだった。
メチャクチャ助かった。すごい感謝している。
取得したxmlデータはオブジェクト変数に格納されており、
要素へのアクセスや管理は便利この上ない。
この辺は流石PowerShellといったところか。以下参考サイト。
PowerShellからXML形式の設定ファイルの情報を読み込む
もちろん今回の記事は自己責任であるから、
利用したことで損害が出たとしても私は一切責任を負わない。
つまりPowerShellが最強ってことだ。いいね?
コメント
PewerShellは実際強い、間違いなく強い。
何かと幅広く使えるからな。