ひょんなことから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は実際強い、間違いなく強い。
何かと幅広く使えるからな。