ざきの学習帳(旧 zackey推し )

日々の学びを書きます

【AngularJS】$resourceのカスタムメソッド、DELETEを扱う場合の注意

AngularJSとは、Angularの古いバージョンを指します。詳しくはWikiの「AngularとAngularJSの違い」を参照してください。(以下、一部抜粋)

2012年6月にリリースされたバージョン1は「Angular 1」や「AngularJS」と呼ばれており、その後、2016年9月にリリースされたバージョン2は「Angular v2」または「Angular2+」と呼ばれていた。ただし、後述の通りバージョンリリースサイクルが早いため、バージョン2以降は単に「Angular」と呼ばれるようになった。

この記事に書くこと

AngularJSの$resourceで...

  • カスタムメソッドを書く方法
  • DELETEメソッドの注意点

カスタムメソッド

$resourceは、RESTfulなAPIに対して、操作する振る舞いを提供するオブジェクトを生成してくれます。

デフォルト、以下HTTPメソッドを提供してくれています。

{
  'get':    {method: 'GET'},
  'save':   {method: 'POST'},
  'query':  {method: 'GET', isArray: true},
  'remove': {method: 'DELETE'},
  'delete': {method: 'DELETE'}
}

PUT / PATCHや、その他のメソッドを生成したい場合は、
以下のような形で定義します。

const User = $resource(
  '/user/:userId',
  { userId: '@id' },
  {
    put: { method: 'put' },
    patch: { method: 'patch' }
  }
);

// 呼び出し方
const body = { name: 'test' };
User.put({userId: 1}, body);
User.patch({userId: 1}, body);

ソースコードを見た際、
get/save/query/remove/delete以外のメソッドが呼ばれているときは、
このような形で定義されている箇所があるはずです。

定義されている場所を特定し、挙動を把握してから使用可否を決めましょう。

DELETEメソッドの場合、Bodyを送信できない

$resourceで定義した(裏で$httpが使われている)DELETEメソッドは、
Bodyの送信をサポートしていないようです。

RFC的にも、DELETEのBodyを送信してはいけないような記述はないとのことです。

ただ、DELETEメソッド=リソースの削除と考えた場合、Bodyを利用するケースは少ないと思われます。

リソースの一部を削除(例えば、users.tags = ['aaa', 'bbb']のようなデータを['aaa']と更新したい)場合は、DELETEではなく、PATCHを用いるのがベターかもしれません。

おわり

以上になります。

気になる点などありましたら、フィードバックいただけると助かります。

所感

新規開発を行う場合、とくに理由がない場合は、その言語・FWの最新(もしくは新しめで安定した)バージョンを使用すると思います。

ただ、会社やプロダクト等のステージによっては、機能開発に専念し、技術の負債が返せないまま...といったことも十分にありえます。

そんな負債に立ち向かうときにも、古い技術の記事も残しておくべきかな...と考え、本記事を書きました。

↑のようなケースな方の参考になれば、幸いです。