月別アーカイブ: 2015年10月

CodeIgniter 3でREST風のAPIを実装する

GET/POST以外のHTTPメソッド/JSONで入力

REST風のAPIを実装するには一般的にはGETやPOSTだけでなくPUTやDELTE等のHTTPメソッドからの入力にも対応する必要が有りますが、CodeIgniter 3.0.xを利用している環境ではどうやって拾うの?という話。

CodeIgniter 3からInputライブラリに raw_input_stream というプロパティが追加されており、そこから読み込むだけで簡単に文字列を取得できます。

Input Class
https://www.codeigniter.com/user_guide/libraries/input.html

また、このraw_input_streamを使う事でフォームのようなkey=valueではない($this->input->post()で拾えない)値が取得出来ます。あとはJSON形式で投げているならjson_decodeしたりなんなりで。

// raw_input_streamとjson_decodeはnullを返すことが有るよ!
$raw_input = $this->input->raw_input_stream;
$json = json_decode($raw_input);

Q. CodeIgniter 2.x の場合
A1. CodeIgniter 3.xにアップグレードする。1日あれば動くようになるはず。
A2. PHP 5.5以前の環境であるなら5.6以降にして php://input ストリームを開く。
A3. CI_Inputクラス魔改造。お勧め出来ない。

柔軟にURLとコントローラの対応を取りたい

コントローラクラスのフォルダ階層分けやurlヘルパーでのsegment取得、引数指定で頑張ってもいいですが、コントローラに_remapメソッドを定義すれば柔軟性が上がります。URLだけを見るルータ側での設定とは違ってHTTPメソッドによって呼び出すメソッドを変えるような事もやりやすくなるかもしれません。

Controllers — CodeIgniter 3.0.2 documentation Remapping Method Calls
https://www.codeigniter.com/user_guide/general/controllers.html#remapping-method-calls

例えば存在しない機能を叩いた場合のWeb API向け404処理などを振り分けやすくなりますね。

特定の環境でexFATのHDDが有ると起動しない件

既に夏ごろの話なのですが、メインPCをWindows10にリプレースするにあたって遭遇した現象。最終的にはNTFSでフォーマットしなおす結果になりました。はっきりした事は分かっていませんが、状況をメモしておきます。UEFI(BIOS)のPOST時点で起動がフリーズするのでOSは関係なさそうです。

  • 発生した状況はマザーボードにASUSTek P8Z68-M PRO、HDDはHGST HDP725050GLA360を利用している環境。
  • 再現率100%。
  • exFATのHDDは起動ドライブではない。起動ドライブはNTFSでフォーマットされたSSDを利用しておりSSDのみ繋いだ状態では問題なく起動する。
  • UEFIをその時点の最新バージョンに更新してみるも特に変わらず。
  • exFAT形式でのフォーマットはWindows7 SP1で実施。
  • どうもチップセットに関係なく同様の状況が起きているケースもある模様。
    ―(検証希望)3TBのHDDをexFATで初期化するとHDDにロックがかかる
    http://bbs.kakaku.com/bbs/K0000424008/SortID=16591024/#tab
  • NTFSでフォーマットしなおしたら改善。