RESTのリソースの扱い
$httpサービスはXHR(XMLHttpRequest)のリクエストを行うための低レイヤーの実装を提供している。
一方、ビジネスロジックの実装に際しては、オブジェクトモデルを理解し表現できるようなJavaScriptのオブジェクトが便利である。
このような機能を実現するのが、AngularJSの$resourceである。以下のような点が指定できる。
- サーバ側でのリソースを表すURL
- リソースへのリクエストでよく使われるパラメータの種類
- get, save, query, remove, deleteに加え、オブジェクトモデルでのビジネスロジックや機能をカプセル化したメソッド
- レスポンスとして期待されているデータ型
- ヘッダー
なお、AngularJSの$resourceを使うべきなのは、サーバ側がRESTfulなふるまいをするWeb APIになっている場合だけである。REST以外の場合(JSON RPCなど)には、$resourceを使うべきではない。
(このためかは不明だが、$resource(ngResource)は組み込みのオブジェクトではなく、$route(ngRoute)と同様、外部モジュールとして提供されている)
$qとpromise
primiseとは:
- 非同期形式のリクエストは、実際の戻り値の代わりにpromiseを返す
- promiseにはthenという関数が用意される。thenは引数を2つ受け取る。1つはresolved、もう1つはrejected。これらには、実際の値あるいは失敗の理由のいずれかが渡される。
- リクエストの結果が返されるとすぐに、どちらかのコールバックが必ず呼び出される
AngularJSの$qは:
- AngularJSに対応しており、スコープのモデルに統合されている
- AngularJSのテンプレートは$qをpromiseではなく実際の値として扱うことができる
- AngularJSでは、promiseの機能のうち基本的かつ重要なものだけを採用しているため計量
レスポンスの横取り
サーバ呼び出しの度に何らかの処理(エラー処理、認証、有害なデータの除去など)を行いたい場合、レスポンスインターセプタという仕組みを利用できる。
セキュリティに関する注意点
JSONの脆弱性
対策は以下。
- 重要な情報は必ずPOST形式のリクエストに対するレスポンスの中で、配列ではなくJSONオブジェクトで返す
- 意図的に改変されたJSONデータをレスポンスとして返し、クライアント側でこれを実際のデータへと復元する
AngularJSはいずれの方法にも対応している。
XSRF(Cross-Site Request Forgery)
クライアント側でXHRのリクエストを行う際、cookieからXSRF-TOKENという名前のトークンを取り出してX-XSRF-TOKENというHTTPヘッダーにセットする(サーバ側にも対応が必要)。