By Jeremy Brooks under CC BY-NC
先日、cURL as DSLというツールを公開しました。その後、何度も同じような質問を受けたりしたので、ブログにまとめてみます。
なぜこのツールを作ったの?
RESTfulというものは大分一般的になってきました。HTTPでAPIを提供というのもよく見かけます。ですが、僕はこのRESTfulというやつが嫌いです。
GETのURLをシェアすればいつでも同じページがある(変な状態を持たない)、みたいな思想はいいんですが、HTTPのAPIはどうも使いにくい。ドキュメントのHTTPのサンプルを見て、ドキュメントをじっくり読み込んで、パラメータをJSONやらXMLで組み立ててボディに乗っけて(しかも大抵パラメータがアホのように多い)、いろいろ決められたルールで認証してヘッダに埋め込んで・・・・ちょっとでも違うと、400しか返してくれないとかザラです。どこがうまくいかないのかきちんと情報を返してくれればいいんですけどね。やりたいこと(機能を1つ呼び出す)に対して、そこまでなかなか遠い。だいたい、ここを読んでいる人たちも、RESTful APIと、自分が使っている言語(RubyでもPythonでもnode.jsでも)のクライアントライブラリの両方があったら、迷わず後者を選びますよね?RESTful APIを触っている時の気持ちは、libffi経由でCで書かれた共有ライブラリを呼び出しているのと似ている気がします。で、バリデーションは送信側にしろ受信側にしろ、出て実装しないといけない。
だいぶ前にやったXMLRPCの方がまだ開発のしやすさは圧倒的に高い。また、WSDLとか、CORBAとか、我々人類はもっと便利なものを一度は手にしたのに、なぜ退化しちゃっているのか?ブラウザ主体だと、JSができることがメインとならざるを得なくて、それでXMLHttpRequestとかjQueryのAjax APIなんかで扱いやすい仕組みとしてRESTfulが主流になってきたのかなぁ・・・とか考えていますが、実際のところはよくわかりません。
RESTful時代にドキュメントとして書かれるのはHTTPのテキストと、たまにcURLコマンドです。それらのドキュメントの中にある情報の断片でクライアントが作れれば、試行錯誤の回数は確実に減ります。人間向けのドキュメントを機械が読んでくれたらうれしいですよね?本当はセマンティックウェブを実現しているSphinxのhttpドメインを使いたかったんですが・・・
とは言え、便利に使いたい、というだけであれば、Swaggerもあるし、これの開発を初めて、1-2個の言語出力ができるようになった時に、GoogleがgRPCを発表しました。使えるのであれば絶対にこっちの方がいいと思います。インタフェース生成の仕組みのお陰で、送信前に変なリクエストは事前に除外できますし、バリデータを自分で書かなくてもいいし、開発の効率は良いと思います。
用途としては、ウェブアプリのテストとか作るのが簡単になったらいいなぁ、とちょびっと思っています。