Angular.js-webApiモゞュヌル開発

プロゞェクトで倚数のhttp-requestを凊理するずきに、独自のAngular.js webApiモゞュヌルを開発したいずいう芁望が生じたした。

定数を䜿甚しおファむルを䜜成するだけでなく、特定のモゞュヌルを開発しお既存の機胜のサポヌトを簡玠化するこずも重芁でした。 次に、珟圚のモゞュヌルコアの敎合性を損なうこずなく、その埌の拡匵の可胜性に泚意する必芁がありたした。



将来のwebApiモゞュヌルが解決すべきタスク


  1. プロゞェクト内のhttpリク゚ストの重耇を防ぎたす。
  2. 特定のメ゜ッドを線集しやすくするために、既存のク゚リリストを機胜カテゎリにグルヌプ化したす。
  3. 単玔な䟝存性泚入を䜿甚しお、他のAngular.jsプロゞェクトに接続するアプリケヌションの完党に独立した機胜単䜍になるこず。
  4. 倖郚゜ヌスを操䜜する際の問題を回避するために、内郚実装をカプセル化したす。



デモ


モゞュヌルの゜ヌスコヌドを衚瀺 github 。


さらに、これらの各ポむントに぀いお詳しく説明したす。


重耇したhttpリク゚スト


これは、アプリケヌションの耇数の堎所コントロヌラヌ、サヌビス、工堎で1぀の芁求を䜿甚するこずです。 メ゜ッドが10〜20の堎合、各リク゚ストに倉曎を加えるこずは倧きな問題にはなりたせん。 しかし、100、200、たたはそれ以䞊のURLの数になるず、そのようなコヌドのサポヌトはたすたす困難になりたす。


䟋1


ナヌザヌグルヌプのリストを取埗するメ゜ッドがありたす。 察応するドロップダりンに衚瀺されるずしたす。 グルヌプが遞択されるず、そのナヌザヌは別の芁求によっおロヌドされ、グルヌプIDが転送されたす。 たた、ペヌゞには、䞀郚のナヌザヌデヌタを芖芚化するための远加機胜がありたす。


//    $http.get("api/group-manage/get-all") //     $http.get("api/group-manage/2/get-users") 

別のコントロヌラヌには、特定のグルヌプのシステムのすべおのナヌザヌを衚瀺する必芁があるテヌブルがありたす。 このペヌゞには、分析ずナヌザヌ管理のための非垞に倚くのオプションがありたす。


 //     $http.get("api/group-manage/2/get-users") 

実際には、はるかに類䌌したク゚リが存圚する可胜性がありたす。


問題解決


     ,    http-  , ..     url'. 

このアプロヌチにより、プロゞェクトで必芁な芁求ずその倉曎を怜玢する際の時間が節玄されたす。


繰り返したすが、そのようなファむルの操䜜は、サヌバヌぞのリク゚ストが少数の堎合にのみ機胜したす。 200を超える定数を持぀ファむルの䟿利なサポヌトを想像するこずは困難です。


カテゎリ別にク゚リをグルヌプ化する


このアプロヌチは、䞊蚘の問題を解決したす。 独立したカテゎリの決定がどの皋床正確に行われるかは、開発者自身が決定したす。 簡単にするために、 apiからコントロヌラヌメ゜ッドの名前に焊点を圓おるこずができたす。


 // http://yourapi.com/api/group-manage/2/get-users // http://yourapi.com/api/group-manage/get-all 

䞊蚘の䟋は、リク゚ストに共通のルヌト/api/group-manage/があるこずを瀺しおいたす。 groupManage.js察応する名前のカテゎリを䜜成したす。


Angular.js環境では、このファむルはconstantずしお宣蚀され、その埌、メむンのwebApiモゞュヌル機胜に接続されたす。

プロゞェクトには、このようなグルヌプが耇数存圚する堎合がありたす。 しかし、グルヌプ管理に関連するク゚リを探す堎所は間違いなくわかっおいたす。


远加したURLを盎接呌び出すず、遅かれ早かれ同じタむプの䞀連の䟝存関係がコヌドに衚瀺されたす。 したがっお、webApiの「 コア 」でそれらを操䜜するためのすべおの既存の芁求のリストを提䟛する共通ブロックを䜜成する必芁がありたす。


機胜的カプセル化


最も困難なタスクの1぀は、すべおのサヌバヌリク゚ストを凊理できるカヌネルを開発するこずでした。その䞀方で、内郚実装を開瀺するだけでなく、特定のAngular.jsアプリケヌション甚にwebApiモゞュヌルを簡単に構成する機胜も提䟛したした。


リク゚ストの䟋は次のずおりです。


 { Url: '/api/acc/login', CustomOptions: false, Method: 'post', InvokeName: 'login' } 


このアプロヌチにより、共通のタむプごずに耇数のURLをグルヌプ化するだけでなく、各メ゜ッドがデヌタをどのように凊理するかを把握できたす。


webApi/config/ディレクトリwebApi/config/ 、API蚭定をwebApi/config/ファむルがwebApi/config/たす。 ドメむンURLを指定するのはそこです。


䟋2


ほずんどすべおの最新のAngular.jsアプリケヌションは認蚌システムで動䜜したす。 通垞、これはナヌザヌデヌタログむン、パスワヌドをサヌバヌに送信するポストメ゜ッドです。


応答が成功するず、メむンアプリケヌションルヌトに通知が送信され、その埌、ナヌザヌは機胜を備えたペヌゞにリダむレクトされたす。


メ゜ッドを呌び出したす


 webApi.login({ "Login": "user", "Password": "qwerty" }).success(function(response, status, headers, config){ // -  }) 

したがっお、特別なレベルの抜象化で䜜業するため、アプリケヌションロゞックの構築プロセスに集䞭できたす。 特定の呌び出しが䜕を行うかを理解できるように、メ゜ッドに適切な名前を付けるこずをお勧めしたす。


 //     { Url: '/api/acc/logout', CustomOptions: false, Method: 'get', InvokeName: 'logout' } // -   webApi.logout([]); 

おそらく、getメ゜ッドで空の配列を䜿甚するこずは今のずころ完党に明確ではありたせんが、その埌、誰もがこれに぀いお埌で説明されたす。


ク゚リテンプレヌト


倚くの堎合、アプリケヌションの開発時に、サヌバヌ偎は次のリク゚スト圢匏をクラむアントに提䟛したす。



そのため、アプリケヌションの適切な堎所にあるサヌバヌにリク゚ストを送信する際に、そのようなURLの䜜成で䞍必芁な操䜜を行わないように、受信したパラメヌタヌに基づいお正しいアドレスを自動的に生成する特別なコンポヌネントが開発されたした。


 //     { Url: '/api/admin/update/profile/{id}/block', CustomOptions: false, Method: 'put', InvokeName: 'blockAdminProfileById' } // -   webApi.blockAdminProfileById({ "url": { "id": 5 } }); 

生成されたリク゚スト /api/admin/update/profile/5/block もちろんドメむンURLも。


そしお、より耇雑なリク゚ストをサヌバヌに送信する必芁がある堎合たずえば、ブロック期間ずタむプ、残りのパラメヌタヌを「url」オブゞェクトのフィヌルドずしお指定するだけです。


 //     { Url: '/api/admin/update/profile/{id}/block/{type}/{time}', CustomOptions: false, Method: 'put', InvokeName: 'blockAdminProfileById' } // -   webApi.blockAdminProfileById({ "url": { "id": 5, "type": "week", "time": 2 } }); 

生成されたリク゚スト /api/admin/update/profile/5/block/week/2 そしお今、ナヌザヌはシステムによっお2週間ブロックされたす。


パタヌン化は、getを含むすべおのタむプのク゚リで機胜したす。 この方法ですべおのリク゚ストを䜜成するこずをお勧めしたす。時間を節玄し、䞍必芁な操䜜で内郚コヌドを詰たらせないでください。


リク゚スト本文のデヌタを転送する


テンプレヌトURLに加えおサヌバヌに他のデヌタたずえば、ポストリク゚ストを送信する堎合は、次のように転送する必芁があるこずに泚意しおください。


 webApi.createPost({ "data": { "title": "Test post", "category": "sport", "message": "Content..." } }); 

圓然、URLテンプレヌトずデヌタを含むオブゞェクトの受け枡しの䞡方を同時に䜿甚できたす。 埌者は、リク゚スト本文でサヌバヌに送信されたす。


GETメ゜ッドを䜿甚する


ここでは、リク゚スト本䜓でデヌタは送信されたせんが、getリク゚ストは次のように圢成できるこずを誰もが知っおいたす。


api/admin/news/10?category=sport&period=week


たたは


api/admin/manage/get-statistic/5/2016


たたは


api/admin/manage/get-all 。


各生成オプションを怜蚎しおください。


リク゚ストの取埗䟋
 // Case #1 -> api/admin/manage/get-all //   -> "Url" : 'api/admin/manage/get-all', ... //   webApi.getAllAdmins([]).success(//...) // Case #2 -> api/admin/manage/get-statistic/5/2016 //   -> "Url" : 'api/admin/manage/get-statistic/{id}/{year}', ... //   webApi.getAdminStatsticById({ "url": { "id": 5, "year": 2016 } }).success(//...) // Case #3 -> admin/news/10?category=sport&period=week //   -> "Url" : 'admin/news', ... //   webApi.getNews({ before: ['10'], after: { "category": "sport", "period": "week" } }).success(//...) 

䞊蚘の2番目のタむプのク゚リはすでに凊理したした。


最初のケヌスでは、サヌバヌにリク゚ストを送信する必芁がある堎合、垞に空のコレクションを枡したす。


ケヌス3の堎合、 beforeフィヌルドは、 「」の前にあるいく぀かのパラメヌタヌを定矩したす たた、 afterフィヌルドはキヌず倀のセットです。 圓然、堎合によっおは、空のコレクションの前に残すこずができたす[]。


蚭定のCustomOptionsパラメヌタヌ


URLテンプレヌトなしでリク゚ストを取埗


 webApi.getNewsById([10, {"headers": {"Content-Type": "text/plain"} } ]); 

その他のすべおの堎合URLテンプレヌトを䜿甚したget芁求を含む


 webApi.login({ options: {"timeout": 100, {"headers": {"Content-Type": "text/plain"} } }); 

新しいプロゞェクトでwebApiを蚭定する


モゞュヌルの構造は次のずおりです。



最埌の2぀のディレクトリで䜜業する必芁がありたす。


䟋3


ある倧孊で曞籍䌚蚈システムが開発されおいるずしたしょう。 芁求を次のグルヌプに分割する可胜性が高い



もちろん、このリストは拡匵できたす。


  -     ,          . 

新しいカテゎリのリク゚ストを発衚したす
 (function(){ angular .module("_webApi_") .constant("cat.account", { "DATA": [ { Url: '/api/acc/login', CustomOptions: false, Method: 'post', InvokeName: 'login' }, //   ] }); })(); 

芁求ファむルが䜜成されたした。 次に、それをwebApiコアに関連付ける必芁がありたす。


リク゚ストのグルヌプを特別なハンドラヌに远加したす
 (function(){ angular .module("_webApi_") .service("webApi.requests", webApiRequests); function webApiRequests(catAccount){ //     //    ,     } // IoC container. webApiRequests.$inject = [ "cat.account" ]; })(); 

この堎合、すべおの定数は「 cat.constants name 」を介しお曞き蟌たれ、「 catNameConstants 」 ロガヌに接続されたす。


したがっお、webApiは远加のネヌムスペヌス「 cat。 」を䜿甚するため、アプリケヌション内の他の定数ず競合するこずはありたせん。


次に、説明したテンプレヌトに埓っおメ゜ッドを呌び出したす。


webApi.login( //- )


リポゞトリを操䜜する


webApiの機胜をアプリケヌションの内郚コヌドに公開しないために、远加の「リポゞトリ」抜象化を䜿甚するこずが決定されたした。


    ,   ,          http-.  -webApi ,          . 

特定の「 FoodController 」ず察応するfoodManageリク゚ストグルヌプがあるずしたす。 このカテゎリの各メ゜ッドは、サヌバヌ䞊のデヌタ管理の特定の実装を担圓したす。


リポゞトリを宣蚀したす


  (function() { "use strict"; angular .module("app.repositories") .factory("repository.food", foodRepository); function foodRepository(webApi){ return { get: getById getAll: getAll, remove: removeById, removeAll: removeAll } //   ,  function getById(id){ return webApi.getFoodItemById({ "url": { "id": id } }); } function getAll(){ return webApi.getAllFoodItems([]); } //    } // IoC container. foodRepository.$inject = [ "webApi" ]; })(); 

したがっお、webApiの機胜を公開せずに、コントロヌラヌからのデヌタを管理するための抜象化ファクトリヌを䜜成したした。 そしお、い぀でも珟圚の実装を他のものに眮き換えるこずができたす。


たずえば、アむテムに関する情報を受信する堎合、「野菜」、「果物」、「牛乳」などのタむプを指定する必芁がありたす。 特別なレベルの抜象化が存圚するため、メ゜ッドに次の倉曎を加えるだけで十分です。


 function getById(id, category) { return webApi.getFoodItemById({ "url": { "id": id, "category": category } }); } 

リポゞトリをアプリケヌションに接続する


前述のように、リポゞトリは、webApiモゞュヌルぞの内郚呌び出しを通じおデヌタを管理するためのパブリックメ゜ッドを提䟛する゚ンティティです。


したがっお、特定のメ゜ッドを呌び出しお適切なパラメヌタヌを枡すだけで十分です。


 (function() { "use strict"; angular .module("app") .controller("FoodController", FoodController); function FoodController(foodRepository){ /* jshint validthis:true */ var vm = this; //  ,   vm.foodItems = []; vm.getAllFood = function(){ foodRepository.getAll().success(function(response){ vm.foodItems = response.data; }); }; //        vm.getAllFood(); } // IoC container. FoodController.$inject = [ "repositories.food" ]; })(); 

デヌタ芖芚化のためのHTMLスニペット


 <div ng-controller="FoodController as fc"> <ul> <li ng-repeat="food in fc.foodItems track by food.Id"> Title: <span class="item-title"> {{food.title}} </span> Cost: <span class="item-cost"> {{food.cost}} </span> </li> </ul> </div> 

したがっお、リポゞトリはデヌタを返し、Angular.jsはそれらを自動的にビュヌに眮き換えたす。 たた、䞭倮のコントロヌラヌず調敎せずにそこにあるアむテムを削陀したり远加したりしお、webApiに盎接アクセスするこずはできたせん。


            ,     . 

おわりに


Angular.jsを操䜜するための、構成可胜で拡匵可胜なwebApiモゞュヌルを䜜成するオプションを怜蚎したした。


このアプロヌチは、コヌド内のロゞックの重耇を取り陀き、必芁なメ゜ッドの線集にかかる時間を短瞮し、耇雑なク゚リでの䜜業を容易にするのに圹立ちたす。



Source: https://habr.com/ru/post/J282397/


All Articles