`

AngularJS中的RESTful资源

阅读更多

        $http服务提供了一个非常低级的实现,可以用来发送XHR请求,同时它还为你提供了很大的可控性和灵活性。但是,在大多数情况下,我们需要处理对象,以及封装了特定属性和方法的对象模型,例如一个person对象(带有详细信息),或者一个信用卡对象。

        在这些情况下,如果我们能够创建一个JS对象,而且它可以理解并代表这种对象模型,是不是会很棒?如果我们仅仅编辑这个对象的属性,例如保存或者更新,那么这些状态会被持久化到服务端吗?

        $resource就是为这一功能而设计的。AngularJS中的resource(资源)允许我们用描述性的方式来定义对象模型,它可以描述以下内容:

        1.资源在服务端的URL。

        2.常用的请求参数类型。

        3.一些附加的方法(你可以自动获得get、save、query、remove和delete方法),这些方法为对象模型包装了特定的功能和业务逻辑(例如信用卡对象的charge()方法)。

        4.期望获得的响应类型(一个数组或者一个对象)。

        5.协议头。

        使用Angular所提供的$resource对象,你可以根据各种需求查询服务器;除此之外,你还可以把服务端返回的对象当成已经持久好的数据模型,你可以修改它们,并且可以把它们持久化。

        ngResource是一个独立的、可选的模块。为了使用它,需要:

a.在加载的脚本文件中包含angular-resource.js

b.在模块依赖声明中包含ngResource(例如,angular.module('myModule', ['ngResource']))。

c.在需要的地方使用注入的$resource服务。

        在学习如何使用ngResource方法创建资源之前,我们先来看看使用基本的$http服务创建类似的东西需要做些什么事情。对于我们的信用卡资源来说,除了要能够对它进行"change"(收费)操作之外,我们还要能够get(获取)、query(查询)以及save(保存)信用卡。

        以下是一种可能的实现:

myAppModule.factory('CreditCard', ['http', function($http) {
     var baseUrl = '/user/123/card';
     return {
          get: function(cardId) {
                return $http.get(baseUrl + '/' + cardId);
          },
          save: function(card) {
                var url = card.id ? baseUrl + '/' + card.id : baseUrl;
                return $http.post(url, card);
          },
          query: function() {
                return $http.get(baseUrl);
          },
          charge: function(card) {
                return $http.post(baseUrl + '/' + card.id, card, {params: {charge: true}});
          }
     };
}]);

        除了这种方式之外,还可以简单地创建一个Angular服务,这个服务将会通过以下方式来描述应用所提供的资源:

myAppModule.factory('CreditCard', ['$resource', function($resource) {
     return $resource('/usr/:userId/card/:cardId',
              {userId: 123, cardId: '@id'},
              {charge: {method: 'POST', params: {charge: true}, isArray: false});
}]);

        现在,只要向我们AngularJS注射器请求一个CreditCard实例,我们就可以获取一个Angular资源,它默认为我们提供了一些基础的方法。下表列出了这些方法的内容以及它们的行为,有了这些信息你就知道应该如何配置服务端了。

        下面我们来看一个信用卡的实例,这会让我们的思路更加清晰。

//假设CreditCard服务被注入到了这里

//我们可以从服务端获取一个集合,请求的路径为GET:/user/123/card
var cards = CreditCard.query();

//我们还可以在回调函数中获取并使用单张信用卡
CreditCard.get({cardId: 456}, function(card) {
      //每个实例都是CreditCard类型
   expect(card instanceof CreditCard).toEqual(true);
     card.name = "J.Smith";
     //非GET型的方法被映射到了实例上
   card.$save();
     
     //我们自定义的方法也被映射上去了
   card.$charge({amount:9.99});
     //发起一个POST请求:/user/123/card/456?amount=9.99&charge=true
     //发送请求时传递的数据为:{id:456, number: '1234', name: 'J.Smith'}
});

        这个例子涉及了比较多的内容,对于其中比较重要的内容依次介绍如下:

一.声明

        无论是自已定义$resource,还是使用正确的参数来调用注入的$resource函数,操作都非常简单。

        $resource函数有一个必需的参数,即可用资源的URL地址,还有两个可选的参数,即默认参数以及你想配置在资源上的额外动作。

        请注意URL是参数化的(用:来标识参数。:userId表示userId将会被替换成对应的文本,:cardId表示将会被cardId实参的值替换掉)。如果没有传递参数,对应的标识符会被替换成空字符串。

        第二个参数负责处理每一个请求中都会被发送的默认值。在当前这个例子中,我们会把常量123传递给userId。参数cardId更加有趣,“cardId是"@id."”表示的是,如果我们正在使用一个从服务端返回的对象,那么当调用这个对象上的任意方法时(例如调用对象的$save方法),对象上的id属性值就会被赋给cardId参数。

        第三个参数是另一个函数,我们希望在自定义的资源上暴露这个函数。

 

二.自定义方法

        调用$resource时,传递的第三个参数是一个可选的。我们希望在自已的资源上暴露的方法。

        在前面的例子中,我们指定了一个charge方法,可以通过传递一个对象来配置这个方法,对象中的key就是需要暴露的方法名称。配置项中需要指定的内容有:请求的类型(GET、POST等)、需要作为请求的一部分来传递的参数(在这个例子中就是charge=true),以及返回的结果是否是一个数组(在这个例子中不是)。一旦做完这些事情之后,你就可以自由地调用CreditCard.charge()了

        说明:这是一种非常灵活的编码风格,根据上面的代码,对于配置对象{charge: {method: 'POST', params: {charge: true}, isArray: false},Angular会将其解析成一个方法,然后把这个方法绑定到返回的Restful对象上,上面的配置对象解释之后的方法为:

CreditCard.charge = function(charge, isArray) {
     //这里是方法体
}

 

三.别用回调!(除非你真的需要它们)

        第三个需要注意的内容是调用资源时的返回值类型。请再看一下CreditCard.query()调用,我们直接把信用卡对象赋值给了card变量,而并没有在回调函数里面进和赋值。你可能会担心在对服务器进行异步请求的情况下,这种代码能运行吗?

        你这种担心是合理的。但事实上,这段代码完全正确,并且能够运行。这里发生的事情是,AngularJS赋给了card对象一个引用(一个对象或者数组,具体是什么需要根据所期望的返回值类型而定),在未来的某个时间上,当对服务器的请求返回来之后,这个引用才会被真正赋值。在些期间,引用对象一直是空的。

        对于AngularJS应用来说,最常见的处理流程是:到服务器上获取数据,然后把数据赋值给变量,再把数据显示到模板中。这种快捷方式是非常好用的。在控制器代码中,你唯一要做的事情就是发起对服务端的调用,把返回值赋给正确的作用域变量,然后让模板自动负责渲染它。由于card变量是使用{{}}这种数据绑定技术绑定到视图上的,所以一开始给它一个空值并没有问题,等异步响应返回之后再把结果赋给它。这时候Angular的数据绑定机制会立即发现数据发生了变化,然后会自动通知视图进行刷新。从这里可以看到,使用Angular框架时,对异步调用的很多处理方式已经发生了细微的变化。

        如果你有一些需要依赖于返回值才能执行的业务逻辑,那么这种方法就不会奏效。在这种情况下,你就需要使用回调函数,这个回调函数会在调用CreditCard.get()的时候被使用。

 

四.简化服务端操作

        无论你使用返回值的快捷方式,还是使用回调函数,都有一些关于返回对象的注意事项。返回值不是普通的JS对象,而是一个"resource"型的对象。这就意味着,除了服务端返回的数据之外,它上面还带有一些附加的行为(在这个例子中就是$save()和$charge())。这样可以让你更容易进行服务端调用,例如获取数据、修改数据,以及把修改的内容持久化到服务端(也就是在很多应用中都很常见的CRUD操作)。

 

五.何时可以使用Angular资源

        只有服务端按照RESTful的方式工作的时候,你才可以使用Angular资源。对于信用卡场景,它需要:

        1.一个到/user/123/card的GET请求,它会返回用户123的信用卡列表。

        2.一个到/user/123/card/15的GET请求,它会返回用户123的ID为15的信用卡。

        3.一个到/user/123/card的POST请求,在POST的数据中带有信用卡信息,它将会为用户123的ID创建一张新的信用卡。

        4.一个到/user/123/card/15的POST请求,POST的数据中带有信用卡信息,它将会更新用户123的ID为15的信用卡信息。

        5.一个到/user/123/card/15的DELETE请求,它将会删除用户123的ID为15的信用卡信息。

 

文章来源:《用AngularJS开发下一代Web应用》

  • 大小: 44.9 KB
分享到:
评论

相关推荐

    angularJS中文API帮助文档

    AngularJS中文API参考手册详细记录了以上所有功能的使用方法和示例,对于学习和开发AngularJS应用来说,是非常宝贵的资源。无论你是初学者还是经验丰富的开发者,都可以从中获取到所需的信息,提升开发效率。

    SpringBoot Restful AngularJS

    在现代Web开发中,Spring Boot、Spring MVC、Restful API以及AngularJS都是不可或缺的关键技术。本项目结合了这些技术,旨在创建一个高效、灵活的Web服务,为用户提供友好的交互体验。让我们逐一深入探讨这些技术...

    Angularjs 合集 Angularjs 合集

    可能还会讨论AngularJS与其它技术如RESTful API、Bootstrap或jQuery的集成,以及如何使用AngularJS的路由器实现页面导航。此外,性能优化、异常处理和调试技巧也是此类专业书籍通常会涉及的内容。 这些书籍的组合为...

    AngularJS 中文版

    - **API资源**:AngularJS官网提供了详细的API文档,覆盖了框架的所有核心功能,对于深入理解和使用AngularJS非常有帮助。 通过以上内容的学习,开发者不仅可以掌握AngularJS的基本概念和技术要点,还能够构建出高...

    AngularJS Novice to Ninja (英文)

    8. 第八章“Interacting with REST APIs”和第九章“Using REST APIs in Single Page Blogger”介绍了如何通过AngularJS与RESTful服务进行交云,包括使用$http服务和服务端进行通信。 9. 第十章“AngularJS ...

    AngularJs所有插件

    这个压缩包文件包含了一系列AngularJS内置的插件和组件,是开发者学习和应用AngularJS的强大资源。让我们详细了解一下AngularJS的核心概念、插件以及组件。 AngularJS的核心特性包括数据绑定、依赖注入、指令和过滤...

    AngularJS+springmvc的demo

    6. **安全控制**: Spring Security 可以集成到SpringMVC中,提供认证和授权功能,保护应用资源。 在这个入门Demo中,AngularJS 负责前端展示和用户交互,通过`$http`服务向SpringMVC发送HTTP请求。SpringMVC接收到...

    AngularJS 高级程序设计编程学习代码

    本学习资源旨在帮助开发者深入理解AngularJS的高级概念和技术,从而提升编程技能。 **1. 模块化编程** AngularJS的核心理念之一就是模块化,它允许我们将应用拆分为多个可重用的模块,每个模块负责特定的功能。`...

    Learning AngularJS.pdf (0分下载网)

    - **服务**:AngularJS提供了一系列内置的服务,如$http用于发送HTTP请求,$resource用于处理RESTful接口等。 - **路由管理**:AngularJS的路由系统允许开发者创建多视图应用程序,每个视图都可以根据URL的变化而...

    angularjs1.5.8

    - angular-resource.js:资源模块,提供了与RESTful API交互的便捷方式。 - angular-animate.js:动画模块,提供了CSS动画和JavaScript动画的集成。 - angular-sanitize.js:卫生模块,安全地处理和显示用户输入的...

    angularjs Web页面框架 jsp源码

    文件列表"angularjs_jb51"可能包含项目的源代码文件,包括HTML、CSS、JavaScript(可能包括AngularJS的配置、控制器、服务等)、JSP文件以及可能的测试文件和其他资源文件。通过分析这些文件,开发者可以深入理解...

    spring-boot-restful-angularJS-webservice:Spring Boot Restful angularJS WebService

    在这个项目中,AngularJS可能用于构建用户界面,与后端RESTful API交互,实现动态加载、表单验证、路由控制等功能。使用AngularJS的 `$http` 服务,前端可以轻松地发起HTTP请求,调用后端的REST API获取数据。 项目...

    angularjs入门已经常用的小插件

    6. **AngularJS资源**(ngResource):用于与RESTful API交互,简化了HTTP请求的处理。 7. **AngularJS验证**(ngMessages):提供了一种优雅的方式来显示表单验证错误。 8. **AngularJS Cookie**:处理客户端cookie,...

    angularjs管理系统

    例如,$http服务用于与服务器通信,$resource服务用于操作RESTful资源。 5. **过滤器**: 过滤器用于转换数据,如日期格式化、货币转换等。它们可以通过管道符(|)在表达式中使用。 **开发流程** 在开发基于...

    restful-ng:从 angularJs 开始

    此外,AngularJS的Resource服务是专门为了与RESTful API交互而设计的,它允许我们创建资源对象,这些对象直接映射到服务器上的资源,并提供了与HTTP动词对应的CRUD操作。例如: ```javascript var myResource = $...

    AngularJS中文版.pdf 和API文档

    这两个资源对于深入理解和掌握AngularJS是非常宝贵的。通过阅读《AngularJS中文版.pdf》,你可以逐步理解AngularJS的架构和工作原理,而《AngularJS_API.chm》则可以作为实践中查询API和解决问题的参考。结合两者,...

    angularjs 实现增删改查

    在本文中,我们将深入探讨如何使用AngularJS实现MySQL数据库的增删改查功能,并结合后台的Java服务。AngularJS是一个强大的前端JavaScript框架,用于构建单页应用(SPA),而Java则常作为后端语言处理数据操作。让...

    AngularJs与web服务器交互

    后端开发者会定义RESTful接口,比如用Spring MVC的@Controller注解创建一个资源处理类: ```java @RestController @RequestMapping("/api/users") public class UserController { @GetMapping public List...

    Angularjs(增删改+分页+弹框+Sql数据库)

    这个项目对于初学者来说是一个很好的学习资源,因为它展示了如何在AngularJS中整合基本的CRUD操作、分页、弹框以及与后端数据库的交互。通过深入研究这个示例,你可以了解AngularJS开发的常规流程,以及如何利用现有...

    learnig angularJS

    AngularJS 可以与 RESTful API 轻松集成,实现客户端与服务器之间的数据交换。 **实战案例:** 本书介绍如何将应用程序与公共 REST 服务相连,使用户可以进行数据操作,如查询、添加或删除记录等。 #### 四、构建...

Global site tag (gtag.js) - Google Analytics