APIへのPUTやDELETEもブラウザから試す

APIサーバを作っているととにかくcurlで叩いてレスポンスを| jq .して見て, とやっていてリクエストボディのJSONの中括弧や引用符の対応がとれてなくてイライラしたり, 必要なヘッダをつけ忘れていてハマったり, とにかく非効率な感じがしてきたので, ブラウザ上から操作できるようにして, リクエスト内容の編集も(コマンドラインよりは)簡単にできるようにしてみた.

https://raw.githubusercontent.com/tarao/apiconsole/master/doc/console-view.png

特徴

  • スタンドアロンなサーバとして動くのでどんなAPIサーバに対しても使える
  • 結果のJSONを自動整形・ハイライトする
    • そういうのやってくれる拡張入れてるときは余計なことはしないで拡張に任せる
  • リクエスト内容のエクスポートが可能

インストール

  1. golang環境を用意する
  2. 以下のコマンドを実行
$ go get -u github.com/tarao/apiconsole

使い方

$GOPATH/binにパスを通すかバイナリをパスの通ったところにコピーしておく. APIを試したいホスト(ここではexample.com)を--upstreamオプションで指定.

$ apiconsole --upstream=http://example.com

あとはhttp://localhost:8000/devel/consoleでコンソール画面が開く. コンソール画面のポートは--portオプションで, コンソール画面のパスは--mountオプションで指定可能.

動機

もともとは, いま開発中のプロジェクトのAPIサーバにAPIコンソールをつけたかったというのがあった. このプロジェクトでは, APISchemaScala版(これもたぶんそのうち公開する)を使って, JSON Schemaに沿ってリクエストやレスポンスをバリデーションしている. バリデーションエラーを返すときには, エラーの詳細情報を表すJSONの中でエラー位置をJSON Pointerで示すようになっているけれど, これは人間がそのまま読むのは少しめんどくさい. そこで, JSONを整形してエラー位置をわかりやすくしたHTMLも返せるようになっている.

もちろんこれがcurlのレスポンスで返ってきてもしかたがないので, ブラウザで見たときだけ(Accept: text/htmlとかがあったときだけ)表示するようにしていたけれど, それだと必然的にPUTDELETEは試せない. なので, ブラウザでレスポンスを表示しつつ, PUTDELETEのリクエストを組み立てられるものが欲しかった.

APISchemaにはバリデーション内容だけでなく, ドキュメントに表示するためのリソース例を指定できるようになっているので, 特定のエンドポイントに投げるリクエストの典型例が常に定義されている状態になっている. この情報をとってきてapiconsoleフィルインすると, 自分でいちからリクエストを組み立てなくてもよくて非常に楽なので, apiconsole--appendオプションを使ってコンソール画面を改造して, リクエスト例をフィルインできるようにしている. GUIでリクエストを組み立てられるようにするブラウザ拡張などではなく新たに自分で作ったのはこの辺の事情.

想定FAQ

curlコマンドのインポートできないの?

Pull request歓迎します.

application/json以外のリクエストはできないの?

Pull request歓迎します.

拡張とかでできるんじゃないの?

既に書いた通り改造したい需要ありきだったのとチーム内でリクエストをフィルインした状態のパーマリンク共有したりしたかったので自作のWebアプリケーションにしました.

うまく動かないんだけど?

FirefoxGoogle Chromeでしか確認してないので動かない環境はあるかも.

追記: ブックマークコメントへの返信

APIへのPUTやDELETEもブラウザから試す - 貳佰伍拾陸夜日記

chrome extensionでいくつか作られてるよ https://chrome.google.com/webstore/detail/dhc-resthttp-api-client/aejoelaoggembcahagimdiliamlcdmfm

2016/02/05 18:27

本文にも書いたとおり, リクエスト例のインポート機能をつけたい等の理由でブラウザ拡張は不適だと判断しています. それともご紹介されている拡張でこのようなことが可能なのでしょうか?

広告を非表示にする