CodeIgniterでAPIを書く

サボってたわけではない。いや体調不良を理由にサボってました。すみません。

すごくガスが溜まるんです。1日500回ぐらいオナラがでます。年明け、風邪を引いた後、不摂生が続き、どうやら悪玉コレステロール値が上昇。胃腸がかなり弱ってます。食生活は大事にしましょう。

そんなわけで、CI2日目です。CodeIgniter徹底入門を購入して、初めから一つずつ読み進めていこうと思いましたが、多少飽きてしまったのとm(__)m、今回は、自作APIをベースにアプリケーション開発を行うのが主目的ですのであまり意味が無いなと思い、実際にAPIを書くところから始めようと思いました。

・・・早速、壁にぶち当たりました(・_・;)

まず、APIですので I/Oを最初に決めておく必要があるわけですが、APIのリクエストパラメータは、GET/POSTどちらも有効にしたいと考えてました。

理由としては、

  • POSTオンリーでは、ブラウザからURLを直接叩いて検証できない。
  • 単に取得を目的としたAPIであれば、GETを使うべき。

と思うからです。

で、実際はどうかといえば、以下のように GET/POST 両方の形で取得は可能です。では何が問題(?)なのかというと、デフォルトのルーティングでは、/controller/method/1/2/3/... などのように、パラメタは、/コントローラ/メソッド/第一引数/第二引数/...という形でメソッドに渡されます。

これだと、引数の順番を変えたり、追加したり、削除するといった事が容易にできず、APIの仕様を柔軟に変更することが難しくなります。APIですので、当然実装されてしまった後は変更により下位互換が失われることは致命傷となりえます。

一応の回避策として、?key=value 形式を有効にすることも可能です。/application/config/config.php

$config['enable_query_strings'] = TRUE;

とすることで、

index.php?c=controller&m=method&param1=1&param2=2

などとして、渡すことも可能です。

これであれば、最初の目的は果たしているのですが、多少みっともないのと、Formヘルパ、URLヘルパが利用できない制約も生まれます。

出来れば、/Controller/Method/?key=value のような形が望ましいと考えています。
他のフレームワークでは、

/Controller/Method/key1/value1/key2/value2/

なども出来ますが、まぁー正直いうと苦肉の策に見えます。色々悩んだ末の結論ですが、諦めましたw。とりあえず、POSTオンリーでやります。今回のスタイルは気に入らなかったらフレームワークでも言語でも乗り換えるので、まずは、モックを作れれば良しとします。