如何使用可选查询参数为 REST 服务设计 angular 服务 class

How to design angular service class for REST service with optional query params

我有一个 REST 服务,returns 所有学生。

URL : rest/students

我可以给它添加可选参数,

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

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

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);
         }
    }

但我觉得这不是一个好的设计,因为我需要为每个查询参数或查询参数的组合创建一个方法。有人可以建议一种正确的方法吗?

您可以创建一个函数,并在函数参数中传递带有字段值对的查询参数对象。

类似

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

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

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

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

即:

$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 调用。