【问题标题】:How to design angular service class for REST service with optional query params如何使用可选查询参数为 REST 服务设计角度服务类
【发布时间】:2015-12-01 15:57:52
【问题描述】:

我有一个返回所有学生的 REST 服务。

URL : rest/students

我可以向它添加可选参数,例如,

URL : rest/students?department=1001&valid=true

对于这个用例,我创建了一个角度服务,

angular.module('app.student').
     factory('StudentService',StudentService);

StudentService.$inject = ['$http','ENV_CONSTANTS'];
function StudentService($http,ENV_CONSTANTS){
     var service = {
         getAllStudents : getAllSTudents,
         getValidStudents : getValidStudents,
         getValidStudentByDepartment : getValidStudentByDepartment 
     };

     return service;

     function getAllStudents(){
          return $http.get(ENV_CONSTANTS.baseUrl+'/students');
     }

     function getValidStudents(){
          return $http.get(ENV_CONSTANTS.baseUrl+'/students?valid=true');
     }

     function getValidStudentByDepartment (departmentId){
              return $http.get(ENV_CONSTANTS.baseUrl+
              '/students?valid=true&departmentId'+departmentId);
         }
    }

但我觉得这不是一个好的设计,因为对于每个查询参数或查询参数的组合我都需要创建一个方法。任何人都可以提出一个正确的方法来做到这一点吗?

【问题讨论】:

    标签: angularjs angular-services


    【解决方案1】:

    url 构建( baseUrl + "/my-suffix" )设计不错,恕我直言。

    查询参数构建是。 $http.get 可以为此拿一张地图:

    $http.get(myUrl, { params : myParamMap })
    

    IE:

    $http.get(myUrl, { params : { valid : true, departmentId : "myDepId" } });
    

    这使得参数构建变得更容易和更漂亮

    你也可以预先生成你的 url 常量:

    var STUDENT_URL = ENV_CONSTANTS.baseUrl+'/students';
    

    避免在每个方法中构建 url

    $http.get(STUDENT_URL, { params : myParams });
    

    这样更易于维护

    然后你可以分解:

    function performStudentCall(paramMap) {
        return $http.get(STUDENT_URL, { params : paramMap });
    }
    

    能够打电话:

    function getValidStudentByDepartment (departmentId) {
        return performStudentCall({ valid : true, departmentId : departmentId });
    }
    

    在这里,每个操作都有一个服务方法,这是正确的方法,同时只保留一种方法来执行所有 http 调用。

    【讨论】:

    • 感谢您的时间和信息。那么如果 paramMap 在这里为空,它会被自动忽略吗?
    • 我会说是的,但是您可以在 performStudentCall 中防火以检查 paramMap != null 是否确定
    【解决方案2】:

    您可以创建一个函数并在函数参数中使用字段值对传递查询参数对象。

    类似

    function getStudents(queryParamObject){
              return $http.get(ENV_CONSTANTS.baseUrl+'/students', { params : queryParamObject });
    }
    

    【讨论】:

    • krish 打败了我。我建议的唯一另一件事是将端点(在这种情况下为学生)作为函数的必需参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2015-08-26
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多