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

## はじめに
最近ある開発をしているとき、外部APIからのレスポンスXML処理の動作を確認したいがIPアドレスの関係で接続ができずテストができない場面に出くわした。
そんな時に役立つ方法を紹介します。

## 用意するもの
+ PowerShell
+ VSCode (コードが書けるものであればOK)

## テストコード
```ruby:.ps1
# 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>
	<result>OK</result>
	<message>テスト接続</message>
</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()
}
```
## 使い方
使い方は簡単で、上記のテストコードを「.ps1」ファイルとして保存
例）server.ps1
上記のファイルをPowerShellで実行しておく
後はAPIの接続URLが記述されている部分を変更するだけ
今回の場合は``` http://localhost:8888/ ```を接続先にする

## コードの説明
```
# 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はもしもの時のために終了する処理を入れています

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