TECH MEDIA

テックメディア


ローカル環境でAPIのレスポンスXML処理をテストしたい時の方法

ローカル環境でAPIのレスポンスXML処理をテストしたい時の方法

目次
  1. 01|はじめに
  2. 02|用意するもの
  3. 03|テストコード
  4. 04|使い方
  5. 05|コードの説明
  6. 06|最後に

1. はじめに

最近ある開発をしているとき、外部APIからのレスポンスXML処理の動作を確認したいがIPアドレスの関係で接続ができずテストができない場面に出くわした。

そんな時に役立つ方法を紹介します。

2. 用意するもの

  • PowerShell
  • VSCode (コードが書けるものであればOK)

    3. テストコード

    # HTTPリスナーの設定
    $listener = New-Object System.Net.HttpListener
    $listener.Prefixes.Add("http://localhost:8888/")
    $listener.Start()
    # 起動メッセージ
    Write-Host "Listening on http://localhost:8888/ ..."
    try {
        while ($true) {
            # リクエストの受信
            $context = $listener.GetContext()
            $request = $context.Request
            $response = $context.Response
            if ($request.HttpMethod -eq "POST" -or $request.HttpMethod -eq "GET") {
                # レスポンス用XMLの作成
                $xmlResponse = @"
    <?xml version="1.0" encoding="utf-8"?>
    <response>
    <span> <result>OK</result></span>
    <span> <message>テスト接続</message></span>
    </response>
    "@
                # レスポンスの設定
                $buffer = [System.Text.Encoding]::UTF8.GetBytes($xmlResponse)
                $response.ContentType = "application/xml"
                $response.ContentLength64 = $buffer.Length
                $response.OutputStream.Write($buffer, 0, $buffer.Length)
                $response.OutputStream.Close()
            } else {
                # POST, GET以外は405 Method Not Allowed
                $response.StatusCode = 405
                $response.StatusDescription = "Method Not Allowed"
                $response.OutputStream.Close()
            }
        }
    } catch {
        Write-Host "Error: $_"
    } finally {
        $listener.Stop()
        $listener.Close()
    }

    4. 使い方

    使い方は簡単で、上記のテストコードを「.ps1」ファイルとして保存
    例)server.ps1
    上記のファイルをPowerShellで実行しておく
    後はAPIの接続URLが記述されている部分を変更するだけ
    今回の場合はhttp://localhost:8888/を接続先にする

    5. コードの説明

    # HTTPリスナーの設定
    $listener = New-Object System.Net.HttpListener
    $listener.Prefixes.Add(“http://localhost:8888/”)
    $listener.Start()

    # 起動メッセージ
    Write-Host “Listening on http://localhost:8888/ …”

    まずはHTTPリスナーの設定を行います
    localhostのポート番号は使用されていないものであればOK
    ついでに起動しているのがわかるようにメッセージを表示させておきましょう

    try {
    while ($true) {
    # リクエストの受信
    $context = $listener.GetContext()
    $request = $context.Request
    $response = $context.Response

    ここでwhileを使いループをさせます
    「GetContext()」は受信要求を待機するもので、受信するとその要求を返します

    if ($request.HttpMethod -eq “POST” -or $request.HttpMethod -eq “GET”) {
    # レスポンス用XMLの作成
    $xmlResponse = @”
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    if文の条件は、受け取ったHTTPメソッドの比較で
    受け取ったHTTPメソッドが “POST” もしくは “GET” かどうかの判定を行っています
    そして、その条件に一致していればXMLの作成とレスポンスを行うようにします

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # レスポンスの設定
    $buffer = [System.Text.Encoding]::UTF8.GetBytes($xmlResponse)
    $response.ContentType = “application/xml”
    $response.ContentLength64 = $buffer.Length
    $response.OutputStream.Write($buffer, 0, $buffer.Length)
    $response.OutputStream.Close()

    ここは上から順に
    今回作成したXMLをUTF8に変換し格納
    ContentTypeの要求ヘッダーの設定
    XMLのデータの長さを設定
    今回作成した内容の書き込み
    クライアントに応答を送信して領域の開放を行う

    } else {
    # POST, GET以外は405 Method Not Allowed
    $response.StatusCode = 405
    $response.StatusDescription = “Method Not Allowed”
    $response.OutputStream.Close()
    }

    このelse文は、受け取ったHTTPメソッドが “POST”,”GET”以外なら405エラーを返す処理にしています

    } catch {
    Write-Host “Error: $_”
    } finally {
    $listener.Stop()
    $listener.Close()
    }

    try処理を行っているので、もしも処理途中でエラーが発生した場合は
    catch処理でエラーメッセージを表示させるようにしています
    finallyはもしもの時のために終了する処理を入れています

    
    

    6. 最後に

    自分自身まだまだプログラムには全然強くない身ですが、この投稿を見て少しでも誰かの役に立てればと思います。
    説明もあまりうまくありませんでしたが最後まで見ていただきありがとうございます。

    RECRUIT 採用情報

    「eビジネスに関わる全ての人を幸せにする」
    私達とともに新たな時代をつくりませんか?