AngularJSのngResourceモジュールをRestangularに置き換えてみた

AngularJSのngResourceモジュールをRestangularに置き換えてみた

いなば

いなば

Restangularの便利な機能

Restangularの便利な機能をご紹介します。

setBaseUrl

Angularのconfigでリクエスト先のベースとなるURLを指定することができます。

angular.module('config').config([
    'RestangularProvider',
    'ApiUrlConstant',
    function(RestangularProvider,ApiUrlConstant){
        // APIのベースURL
        RestangularProvider.setBaseUrl(ApiUrlConstant.host);
    }
]);

エンドポイントごとに個別に設定もできます。
このエンドポイントだけバージョンが違うといったときなどに使えます。

angular.module('services').factory('MemberModel', [
    'Restangular',
    'ApiUrlConstant',
    function (Restangular,ApiUrlConstant) {
        // http://private-3124d-test3708.apiary-mock.com/v2/membersにリクエストが飛ぶ
        var account = Restangular.withConfig(function(RestangularConfigurer) {
            RestangularConfigurer.setBaseUrl(ApiUrlConstant.host + 'v2');
        }).all(ApiUrlConstant.member);
        return account;
    }
]);

addResponseInterceptor

Restangularを介して行った通信のレスポンスをインターセプト(傍受)してデータの整形などの処理をはさむことができます。

angular.module('config').config([
    'RestangularProvider',
    'ApiUrlConstant',
    function(RestangularProvider,ApiUrlConstant){

        // APIのベースURL
        RestangularProvider.setBaseUrl(ApiUrlConstant.host);

        RestangularProvider.addResponseInterceptor(function (data, operation, what, url, response, deferred) {

            var extractedData;
            if (operation === "getList") {  // getListを実行したときのレスポンスで返ってきたオブジェクトを整形する
                if (data.list) {
                    extractedData = data.list || [];
                    extractedData.total = data.total;
                } else {
                    extractedData = data;
                }
            } else {
                extractedData = data;
            }
            return extractedData;
        });
    }
]);

APIから返ってきているデータ構造を、

{
    "total": 3,
    "list": [
        {/* 省略 */},
        {/* 省略 */},
        {/* 省略 */}
    ]
}

このように整形しています。

[
    {/* 省略 */},
    {/* 省略 */},
    {/* 省略 */},
    "total": 3
]

addRequestInterceptor

addResponseInterceptorの反対でRestangularを介して行った通信のリクエストを、インターセプト(傍受)して処理をはさむことができます。

angular.module('config').run([
    'Restangular',
    function(Restangular){
        Restangular.addFullRequestInterceptor(function (element, operation, route, url, headers, params, httpConfig) {
            if (/*なんらかの条件*/) {
                params.hoge = 'hoge';   // パラメータに変更を加える
            }
            return {
                headers: headers,
                params: params,
                element: element,
                httpConfig: httpConfig
            };
        });

    }
]);

setErrorInterceptor

サンプルコード

setErrorInterceptorはRestangularを介して行った通信でエラーが発生した際にインターセプトして処理を挟むことができます。
デモでは、statusが404で返ってきた場合に404ページへとリダイレクトをしています。(memberのidが5のときに意図的に404を返すようにしてあります)

angular.module('config').run([
    '$location',
    'Restangular',
    function($location,Restangular){
        Restangular.setErrorInterceptor(
            function (response, deferred, responseHandler) {
                if (response.status == 404) {
                    console.log("Resource not available...");
                    $location.path('/notFound');
                } else {
                    console.log("Response received with HTTP error code: " + response.status );
                }
                console.log(response, deferred, responseHandler);

                //return false; // stop the promise chain
            }
        );
    }
]);

setErrorInterceptorのハマりどころとして、CORS(Cross-Origin Resource Sharing)の場合に500番台エラー時のstatusが0になるので注意が必要です。

最初なぜ検知されないのかわからなかったのですが、よく見たらドキュメントに記載がありました。。

https://github.com/mgonto/restangular#restangular-fails-with-status-code-0

まとめ

いかがでしたでしょうか?
Restangularの便利な機能はまだまだあるのですが、案件で実際に使って特に便利だなと思った機能を今回はピックアップしてみました。
個人的にはAngularJSでRESTfulならRestangularは必須だなという印象です。

それでは。

 

【AngularJSの関連記事】

業務で安心して使える厳選AngularJSモジュール8選+α

AngularJSで作成したシングルページアプリケーションをGoogleアナリティクスでトラッキングさせる方法

AngularJSのOne-time Bindingを使ってパフォーマンス改善をしよう

LIG主催のAngularJS勉強会 #ngCurryが開催されました

AngularJS勉強会 ng-mtg#6に登壇してきました

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

フロントエンドエンジニアのいなばです。 LIGではAngularやVueなどのフレームワークを使った中~大規模のWebアプリケーション開発、フロントエンドエンジニアの育成などを担当しています。 好きなものはカフェインとカプサイシン。 趣味はランニングと一眼レフです。

このメンバーの記事をもっと読む
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL