RESTful模式下,资源地址的管理

    公司的前端项目是基于AngularJS1.5 开发的,每个控制器都有对应的 xx.service.js 提供后端接口调用,都是结构类似的代码。其中,后端接口的 URL 都是硬编码在代码中的,那么有没有更好的方法对这些地址进行管理呢?下面对这个问题进行阐述。

    首先,我们假定所有的数据都是资源,所有的操作也都是对资源的操作。例如:查询用户列表是获取“用户集合”这个资源,获取某个用户信息是获取“用户”这个资源,设置用户所属的角色是更新“用户角色关系”这个资源,为订单进行支付是创建“订单支付”这个资源。通过这样的假设,后端提供的服务都可以抽象为对某个资源的获取、创建、修改和删除。这样,前端代码就可能使用统一的模式来各种资源提供服务。

    当我们将操作服务都作为资源来看待时,又分为两种情况:第一种,资源地址是已知的;例如,创建一个“用户”资源后,后端服务会将创建好的“用户”资源的 URL 返回给前端,这样当需要删除该用户时,可以直接使用这个 URL。第二种,资源地址是未知的;例如,我们需要获取“用户集合”资源,但我们并不知道“用户集合”资源的 URL 是多少,资源的 URL 是由后端服务的实现来决定的。综合以上两种情况,资源的 URL 都应该由后端服务提供给前端,如果后端的实现或者环境发生变化,那么这种变化对前端是透明的,从而具有更大的灵活性。

    通过上面的描述,可以把系统提供的服务统一抽象为下面的4个接口,其中 url 表示资源的 URL,params表示资源包含的数据或过滤条件。

    获取:get(url, params);

    更新:update(url, params);

    删除:delete(url, params);

    创建:create(url, params);

    比较简单的策略是,前端启动时向后端服务请求顶级资源的 URL,或者,通过构建工具人工创建出这样的资源字典:var globalResources = { "resourceName" : "URL" }。调用服务时,通过资源名称检索顶级资源 URL。服务返回的顶级资源数据中包含资源状态转移所需的其他资源地址,下面以用户管理的数据为例说明:

    顶级资源字典:var globalResources = { "users" : "/api/v1/users" };

    服务返回的用户数据:var response = { "data" : { /* 用户数据 */ }, states: { "roles" : "/api/v1/users/13/roles", "orgs" : "/api/v1/users/13/orgs" } },其中,"roles"表示用户所属角色的资源地址,"orgs"表示用户所属组织机构的资源地址。这样就比较好的契合了REST的含义;

    后端提供资源 URL的方式,根据不同的框架有不同的实现方式。我们首先使用 ResourceAttribute 自定义属性对资源进行标记。如果是 WCF 服务,可以从所有实现服务契约的类型和类型的方法中加载资源,通过资源的 ResourceUrl 属性获取资源地址;如果是 MVC 或 WebAPI 服务,可以从所有控制器类型和控制器的方法中加载资源,通过资源的 RouteName 属性获取资源地址;ResourceAttribute 属性是自定义属性,如下所示:

    [Resource(ResourceName="", RouteName="", ResourceUrl="")]

你可能感兴趣的:(RESTful模式下,资源地址的管理)