バックエンドをREST風APIとして実装するためにCakePHPを使っていました。
RESTベースのAPIとしてCakePHPを使っていて、下記の内容に従って実装したところ、controller/:id.jsonの形でアクセスできませんでした。 http://book.cakephp.org/2.0/ja/development/rest.html
エラーの内容は以下のようなものです。 例: http://domain/api/v1/HogePiyo/1.jsonにアクセス レスポンス:
{ "code": 404, "name": "Action HogePiyosController::1() could not be found.", "message": "Action HogePiyosController::1() could not be found.", "url": "\/cake\/TLessons\/1.json" }
2箇所の修正で解決できました
- mapResoucesには規約に従ったコントローラ名を指定する。
app/Config/routes.phpに記載しているmapResourcesに問題がありました。
誤:
Router::mapResources('hogepiyos'); Router::parseExtensions();
正:
Router::mapResources('hoge_piyos'); // 以下でも可 // Router::mapResources('HogePiyos'); // Router::mapResources('hogePiyos'); Router::parseExtensions();
- APIにアクセスする際にスネークケースを利用する。
誤: http://domain/api/v1/HogePiyos/1.json
にアクセス
正: http://domain/api/v1/hoge_piyos/1.json
にアクセス
Router::mapResources
の実装(下記url)を見てわかりました。
mapResourcesに渡したコントローラ名をスネークケースに変換(Inflector::underscore)したあとに ルーティングの設定をしているので、CamelCaseだとルーティングしてくれないようです。