JavaScript版でWebAPI(JSON形式)のレスポンスをvar_dumpっぽく表示

WebAPIでJSON形式で返すものを作っていて、レスポンスの中身を簡単に知りたいと思って作ってみました。
ほんとはブラウザの開発機能使えばいいんだろうけど、画面が狭いと使いにくいし、パラメータ入力画面作るんなら、ついでに。。。ってね。

# ソース

全部書くと長いので、必要なところのみを抜粋します。
汚いソースですが、テスト用なのでご愛嬌ってことで。
jQuery1.11.2とbootstrap3.3.4を使ってます。

## HTML

まずはHTMLからURI、リクエストメソッド種類選択、パラメータを入力する部分。
プリフライトの確認もしたかったためOPTIONSも選択肢に入れてます。

```html:入力部
      <table class="table table-bordered">
        <tr>
          <th class="col-xs-3 active">URI</th>
          <td>
            <div class="col-xs-6">
              <input type="text" name="uri" id="uri" class="form-control input input-xlarge" placeholder="Enter URI"/>
            </div>
          </td>
        </tr>
        <tr>
          <th class="active">Request Type</th>
          <td>
            <div class="col-xs-3">
              <select name="type" id="type" class="form-control">
                <option value="GET">GET</option>
                <option value="POST">POST</option>
                <option value="PUT">PUT</option>
                <option value="DELETE">DELETE</option>
                <option value="OPTIONS">OPTIONS</option>
              </select>
            </div>
          </td>
        </tr>
        <tr>
          <th class="active">リクエスト</th>
          <td>
            <div class="col-xs-10">
              <textarea class="form-control" id="data" rows="5"></textarea>
            </div>
          </td>
        </tr>
      </table>
      <button class="btn btn-primary btn-lg btn-block" type="button" onclick="s\
end()" />送信</button>
    </div>
```

次にレスポンスを表示する部分。
ステータスコードと中身を表示。ヘッダーが必要な方は各自実装の事。

```html:表示部
    <h3>ResponseCODE</h3>
    <pre id="code" class="bg-info"></pre>

    <h3>ResponseJSON</h3>
    <pre id="response" class="bg-info"></pre>
```

## JavaScript

以下、JQueryを使ってパラメータを飛ばして、受け取るJavascript。
GET以外はJSON形式で記述して、GETの場合は通常のQueryStringで記述のこと。

```js:リクエストとレスポンス
function send() {
   var contentType = "application/x-www-form-urlencoded";
   if ($("#type").val() != "GET") {
       contentType = "application/json";
   }
   var ajax = $.ajax({
       url: $("#uri").val(),
       type: $("#type").val(),
       dataType: "json",
       async: false,
       data: $("#data").val(),
       beforeSend: function() {
           $("#response").empty();
           $("#code").empty();
       },
       complete: function(msg) {
           $("#response").text(dump(msg.responseJSON));
           $("#code").text(msg.status + " " + msg.statusText);
       }
   });
}
```

そして最後にレスポンスを成形するメソッド
こちらは[JavaScript 版 var_dump](http://ochaochaocha3.hateblo.jp/entry/2014/01/30/var_dump-on-javascript)を参考にさせていただきました。

```js:var_dumpっぽく表示
function dump(value) {
    'use strict';

    if (typeof value !== 'object') {
        return value;
    }

    var indent = '  ';

    // オブジェクトを再帰的に展開して、内容を表す文字列を返す
    function dumpRec(object, depth) {
        var isArray = Array.isArray(object),
            result = (isArray ? '[' : '{') + '\n',
            lines = [],
            v,
            s,
            key,
            i;

        for (key in object) {
            if (object.hasOwnProperty(key)) {
                s = '';
                v = object[key];

                for (i = -1; i < depth; i += 1) {
                    s += indent;
                }

                // キー
                if (!isFinite(key)) { // キーが数値以外の場合
                    key = '"' + key + '"';
                }
                s += key + ': ';

                // 値
                if (v == null) { // nullはobjectなので先に判定
                    s += 'null';
                } else if (typeof v === 'object') {
                    s += dumpRec(v, depth + 1);
                } else if (isFinite(v)) { // 数値
                    s += v;
                } else { // その他=文字列
                    s += '"' + v + '"';
                }
                lines.push(s);
            }
        }

        result += lines.join(',\n') + '\n';

        for (i = 0; i < depth; i += 1) {
            result += indent;
        }

        result += isArray ? ']' : '}';

        return result;
    }
    return dumpRec(value, 0);
}
```