Welcome to WebAPI World

December 5, 2014

nodejs

webapi

WebAPI について

Introduction

Welcome to WebAPI World

これを書きながら Web2.0, Mashup などの言葉を思い出す(だいぶ昔の話なのか)。 それらを構成する要素に WebAPI ってやつもあった。API (Application Programming Interface)です。 Web の技術をベースにした API です。Web の技術ってなんでしょうか。それは HTTP(HTTPS)や URI のことです。 プロトコルのことです。
ここで思考をもっていってほしくない方向は「HTML = Web」って考え方です。Web ページとかの延長線上の話としては 捉えないほうがよいと思います。いったん忘れましょう。
WebAPI といってもいくつか宗教があります。SOAP, WSDL, REST, RESTful などがそれです。 今は REST, RESTful が全盛です。SOAP や WSDL は仕様が複雑すぎてはやらなかったらしいです。 このあたりの歴史は「Web を支える技術」に書いてます。Web 関係のエンジニアはあれを読むべき。 「Web」の捉え方が少し変わるから。

REST(ful) WebAPI とは

REST(REpresentation State Transfer)の略です。アーキテクチャ(設計方法?設計原則?ととらえればよいのか) の名前です。REST な方針に沿って設計されているシステムを RESTful なシステムというらしい。 REST を極めたものの証なのです。下記は REST の特徴です。4 つ書きます。もう少しあった気もします。

リソース

以下は全てリソースです。

リソースの識別子

全てのリソースは 1 つ以上の識別子を持ちます。「大阪の天気」だとこうなる。なるほど、識別子とか小難しいが REST では URI での指定になるんですね。

ちなみに 1 つ以上と書いたのは、上記は以下の URI でも同様だから(以下は仮ね)。つまり、同じ情報でも 捉え方は複数あるよということ。そのためにリソース自体が複数識別子で参照されることがありえる。

どうですか?なんだかセマンティックな話ですよね。セマンティックウェブ!です。ちょっと違うけどそそるでしょ?

統一的なインタフェース

REST は HTTP の技術の上に成り立っています。ということは HTTP の技術をそのまま使います。HTTP って メソッドを持ってるって知っていましたか?実は自分は言われるまで意識していませんでした。 それは「GET」とか「POST」といわれているやつです。あと「PUT」「DELETE」があります。他にも いくつか(拡張含めるともう数種類あります。書きません) これって HTTP のメソッドなんですね。

class HTTP {
  public GET() {
    return hoge
  }

  public POST() {
    return "200OK"
  }

  public PUT() {
    return "404NotFound"
  }

  public DELETE() {
    return "SUCCESS"
  }
}

まぁすさまじく適当ですが、こんなイメージなんでしょうか。基本的にこのあたりのメソッドをメインに使っていくはずです。 REST では HTTP のメソッドを使うことになっているので、それ以外のことを考慮する必要がないんですね。そういう意味では HTTP のメソッド(API)にのっとっているので統一的ってことですね。ちなみにブラウザで URL をたたくと GET メソッドでコンテンツをとりにいくという動きになります。

ステートレス

ステートレスの反対はステートフルです。どういう意味でしょうか。

ステートレスにするとサーバとの接続維持が不要となるのでサーバリソースの解放に貢献できる。 が、認証が必要になる場合はステートレスな API だと毎回認証の処理が走ってかえってリソース食うか? ちなみに tips レベルの話だが「認証」と「認可」の違いをご存じだろうか。

認証されたからといって全てのリソース(ウェブサイトとか)にアクセスできるわけではありません。 そこには、管理者しか見れない(管理者権限保持者のみ閲覧可)なページもあるわけですね。 認証で本人か確認し、認可でその人の持っている権限(ロール)に沿ってできることを制限するという考え方です。 脱線しました。脱線したついでに眠くなってきました。当然、この後 RESTful な WebAPI でなんぞやるんだろうな?って 話にはなるのですが、序盤の序盤までしか動かせなかったのでこうご期待にさせてください。

RESTful な WebAPI の実装

最近は LAMP(Linux, Apache, MySQL, PHP)ではなくて MEAN(Mongodb, Express, AngularJS, NodeJS)らしいぜ。 ということで nodejs と express をインストールして WebAPI もどきを動かしていました。次までにもうちょい発展させて 公開といきたいところです。ちなみに mongodb ってスケーラブルな設計できるけどトランザクションとか機能としてないって 書いてた。配信専用?ある程度の枠組みだったらトランザクション、というか読み書きの順番は保障されるとか って話だからうまく使えばいいんだろうね。あと、HTTPS でロードバランサーかました可用性の高いいけいけな WebAPI 作りたかったけど AWS の ELB(Elastic Load Balancer)高かった… NW トラフィック関係なく月 4000 円は固定で かかりそうな勢いだった。しかも SSL 証明書はでふぉで使えるものあんのかなーって安易に考えてたら なかった。かわなあきまへんのか!そこまでやるー?うーん、SSL 証明書のレベル低い奴は安いって書いてたけど どんなもんなんだろうなぁ。ELB じゃなくても Linux でロードバランスしてもいいのか(HAProxy だっけ?)。SSL はオレオレ 証明書は自己満なのでやりたくない。「https://api.codelogue.com/」とかでかっこよくキメタイ! 思いとしては誰でも WebAPI でお望みの情報を配信できるぜ、WebAPI 基盤を作りたい。誰得ー?

P.S. WebAPI だぜ!インタフェースだぜ!とはいっても配信するコンテンツが面白くていい感じじゃないと、ただの木枠 なんだぜ…

参考