PowerShellにてSOAP API

ひょんなことから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が最強ってことだ。いいね?

 

ブログ主が運営しているゲームです。
こちらよりどうぞ

コメント

  1. 匿名 より:

    PewerShellは実際強い、間違いなく強い。
    何かと幅広く使えるからな。