`

AngularJS 学习笔记-第二章:与后端服务器通信

 
阅读更多

AngularJS能够通过XMLHttpRequest(XHR)和JSONP请求与各种后端交流,拥有通用的$http服务以进行XHR和JSONP调用,以及专门面向Restful后端接口的$resource服务

 

在本章中,将研究与后端通信的API与技术,特别是一下内容:

  • 使用$http服务进行基本的XHR调用,已经进行相应的测试
  • 利用$q服务提供的promise API进行有效的异步请求
  • 使用$resource工厂轻松与RESTful后端进行沟通
  • 根据后端需求构建自定义的与$resource类似的API

$http API快速导览

 

- -
GET $http.get(url, config)
POST $http.post(url, data, config)
PUT $http.put(url, data, config)
DELETE $http.delete(url, config)
HEAD

$http.head

  • url: 调用目标URL
  • data:请求体中送出的数据
  • config:包含额外配置信息,对请求和响应都有影响

处理HTTP响应:请求可能成功或者失败,AngularJS提供两种方法以注册对应这两种结果的回调:success (200~299范围调用success,其余的状态吗则进入error)和error。

 

我们可以在调用$http方法返回的对象上,注册成功与失败的回调(callback)

  • data:实际的响应数据
  • status:响应的HTTP状态
  • headers:访问HTTP响应头信息的函数
  • config:请求触发时提供的配置对象

配置对象说明

  • method:所用的HTTP方法
  • url: 请求的目标URL
  • params: URL参数
  • headers: 额外的请求头
  • timeout:XHR请求终止前的超时时间(毫秒)
  • cache:XHR GET请求的缓存开关
  • transformRequest\transferResponse:在于后端交换数据前或交换后,对数据进行处理的数据变换函数

 

var base_url = 'http://localhost:8080/'
angular.module('myapp1', [])
    .controller('myController', function($scope, $http) {
        var query = $http.get(base_url + "get");
        query.success(function(data, status, headers, config) {
            console.log(data);
            $scope.response = data;
        });
        query.error(function(data, status, headers, config){
            console.log('fail');
            console.log(data);
        });

        var cars = {
            toyota: {
                from: 'japan',
                price: 100000
            },

            benz: {
                from: 'Germany',
                price: 500000
            }
        }
        //post和put的data接受任何Javascript对象(或者字符串),如果是对象则默认被转化为JSON字符串
        var post = $http.post(base_url + '/post/car', cars);
        //$http服务会视图对任何看起来像JSON的响应(以{},[])都执行从JSON字符串到Javascript对象的转化
        post.success(function(data, status, headers, config) {
            console.log(data);
        });

    });

 为了测试简单的restful,你可以用sts创建一个简单点 springboot项目,随便写几个get,post的API如下:

 

 

public class HelloController {

    @RequestMapping("/hello/{name}")
    public String hello(@PathVariable("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello";
    }

    @RequestMapping("/get")

    public @ResponseBody String hello(HttpServletResponse response) {
    //为了解决cross domain的问题,你不需要allow *,你的index.html并不是部署在和springboot所在的localhost:8080的服务器上
        response.addHeader("Access-Control-Allow-Origin", "*");
        return "{\"firstName\": \"John\", \"lastName\": \"Smith\", \"age\": 25}";
    }

    @RequestMapping(value="/post/car", method=RequestMethod.POST)
    public void post1(@RequestBody String body, HttpServletResponse response){
        System.out.println(body);
        response.addHeader("Access-Control-Allow-Origin", "*");
    }
}

 Promise API 

 

promise API的主要思想是,为异步世界带来我们在同步编程世界中所享有的那些便利之处,比如链式方法调用和错误处理。

 

在Promise API中,通常有两个角色:一个是控制未来任务的执行(延迟调用)占位符(promise),领一个则是依赖于未来任务的执行结果(保证承诺结果,resovle、reject)

 

AngularJS拥有非常轻量化的Promise API实现–$q服务,位数不少的AngularJS服务(主要是$http, $timeout等)相当依赖promise API风格,所以为了有效运行这些服务,需要熟悉$q. 
//此处省略$q的介绍,楼主暂时没看懂,而且觉得用处不太大,以后学了再补上。

 

Promise API与http的关系,http返回的承诺对象为then,这让我们能以如下方式覆盖回调注册

 

      var query = $http.get(base_url + "get");
      query.then(function(data, status, headers, config) {
              console.log(data);
              $scope.response = data;
          },
          function(data, status, headers, config) {
              console.log('fail');
              console.log(data);
          }
      )

RESTful端点场提供CRUD操作,虽然这样的端点交互的代码通常很简单直接,不过写起来却很单调乏味。$resource服务允许我们消除重复代码,并让我们在更高的抽象级别上操作,用resources的形式去思考数据操纵,用方法调用来代替低级别的HTTTP调用。

 

 

$resource服务被分发在单独的文件中(angular-resource.js),属于专用模块(ngResource)。为了利用$resource服务,我们需要包含angular-resource.js文件,并在应用模块中声明对ngResource的模块依赖。

 

//HTML
    <div ng-controller="myController">
        <ul  >
            <li ng-repeat='user in users'>Name : {{user.name}}</li>
        </ul>
    </div>

//JS
     var base_url = 'http://localhost:8080/'
     angular.module('myapp1', ['ngResource'])
        .factory('Users', function($resource) {
            return $resource(base_url + 'get');
        })
        .controller('myController', function($scope, Users) {
            $scope.users = Users.query();
        })

 resourceAPI通过

 

resource()方法来使用$resources服务。这个方法可以接受三个参数。

  1. url(必选) 
    我们在这里传入一个包含所有参数的,用来定位资源的参数化URL字符串模板(参数以“:”为前缀)

 

//这里需要注意的是如果:之前的参数是空的(:id),那么URL中的这部分会被压缩成一个.符号。
//如果我们使用的服务器要求在URL中输入端口号,例如:http://localhost:8080/:id 则必须对:转义
//http://localhost\:8080/:id
$resource('/api/users/:id.:format',{
    format:'json',
    id: '123'
});

 

 

  1. paramDefaults(可选) 
    第二个参数包含了发送请求时URL重参数的默认值。对象中的键会与参数名进行匹配。如果我们传入了一个没有在URL中设置过的参数,那它会以普通的查询字符串的形式被发送。
例如,如果URL字符串具有/api/users/:id这样的签名,并且我们将默认值设置为{id:’123’, name:’Ari’},那么URL最终被转化成/api/users/123?name=Ari 
这里可以像上面一样硬编码一个值,也可以设置它从一个数据对象中读取动态值。 如果要设置动态之,需要在值之前加上@字符作为前缀 
{id:’@_id.$oid’}

 

  1. actions(可选) 
    动作对象是具有自定义动作,并且可以对默认的资源动作进行扩展的hash对象。 
    对象的键就是自定义动作的名字,而$http设置的对象的值会对URL中相应的参数进行替换。
$resource('/api/users/:id.:format', {
    format: 'json',
    id: '123'
}, {
    update: { methos: 'PUT' }
});
//action: {method:?, params:?, isArray:?, headers:?}
//isArray表示response是返回[]还是{}

 $resource创建异步方法

$scope.users = Users.query();
console.log($scope.users.length); //这里不会获得你期望的数组长度,而会返回0
//因此你必须使用异步方法去做。
Users.query(function(users){
    $scope.users = users;
    console.log(users.length);
})

 

$resource服务自动生成两套方法。其中一套方法会在类级别,另一套方法会在实例级别

 

 类级别

- Users.query(params, successcb, errorcb) : GET请求期望JSON数据返回,用于取得条目列表
- Users.get(params, successcb, errorcb): GET请求,期望JSON返回单个对象,用于取得单个条目
- Users.save(params,payloadData, successcb, errorcb): POST请求,请载荷中产生
- Users.delete(params, successcb, errrorcb):DELETE请求。

 params孕育我们为每个动作制定参数,它们将成为URL的一部分,或者作为查询字符串中的参数。

 

实例级别

var user = new Users({
    name : 'SuperHero'
});

user.$save();
user.$delete();

 

 自定义方法 

$resource工厂默认生成的方法对典型用例来说已经相当够用,但如果后端某些操作使用不同的HTTP动词(如PUT或者PATCH),那么在资源级别上添加自定义方法也相当容易。

分享到:
评论

相关推荐

    AngularJS学习笔记 - 进出自由,我的分享1

    【AngularJS学习笔记 - 进出自由,我的分享1】 AngularJS是一款由Google开发的JavaScript框架,用于构建富客户端Web应用程序。它强调数据绑定和依赖注入,简化了前端开发流程,尤其是在实现MVC(模型-视图-控制器)...

    配套学习资料:Java开发 - 尚硅谷JavaWeb学习笔记

    学习笔记请看我写的文章: Java开发 - 尚硅谷JavaWeb学习笔记 - Part1: https://blog.csdn.net/qq_63317769/article/details/139883728 Java开发 - 尚硅谷JavaWeb学习笔记 - Part2: Java开发 - 尚硅谷JavaWeb...

    2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法

    2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-...

    Microservice-with-Python:Belajar后端dengan Python

    在本项目"Microservice-with-Python: Belajar后端dengan Python"中,我们将探讨如何使用...在文件列表"Microservice-with-Python-main"中,可能包含了项目的源代码、笔记、示例和相关资源,供你进一步研究和学习。

    DAMA学习笔记-第01-17章细化第5章数据建模较多内容

    DAMA学习笔记-第01-17章细化第5章数据建模较多内容

    wejapa-backend-php-wk-1:WeJapa后端PHP Week 1任务

    wejapa-backend-php-wk-1 WeJapa后端PHP Week 1任务为此回购贡献(添加您的工作/代码) 5分钟的阅读入门: 确保您使用台式机或笔记本电脑并登录到Github 第1步:点击右上角的Fork 第2步:点击克隆或下载,点击后复制...

    JS AngularJS 学习笔记

    **AngularJS 框架详解** AngularJS 是一个强大的JavaScript框架,由Google维护,用于构建动态Web应用。它通过MVC(模型-视图-控制器...通过深入学习和实践,你可以有效地利用AngularJS构建高效、可维护的Web应用程序。

    AngularJS学习笔记

    **与jQuery集成**:AngularJS能够与jQuery很好地协同工作,实际上,如果项目中未使用jQuery,AngularJS本身就提供了一个轻量级的jQuery替代品,主要用于DOM操作。 **DOM操作**:在使用AngularJS时,尽管可以直接...

    angularjs学习笔记

    **AngularJS学习笔记** AngularJS,作为一款强大的前端JavaScript框架,由Google维护,主要用于构建单页应用程序(SPA)。它的核心特性包括数据绑定、依赖注入、模块化和指令系统,极大地简化了网页应用的开发流程...

    angularjs-ts-seed:AngularJS TypeScript应用程序种子

    介绍用TypeScript编写的AngularJS应用程序的种子... 该项目受到极大启发特征AngularJS 1.4.x Angular新路由器(已过时,正在等待angularjs 1.5.x与新路由器一起更新) 系统JS单元测试摩卡咖啡柴西农如何开始git clone ...

    backend-101-course:有关后端应用程序基础的资源和讲座

    在这个"backend-101-course"中,初学者可以学习到如何创建和管理服务器、如何设计数据库模型、以及如何实现API(Application Programming Interface)来与前端应用进行通信。 JavaScript,作为标签中提到的关键技术...

    java各知识点详细总结(毕向东笔记整理)

    第一章:编程基础 3-11 第二章:数组 11 -31 第三章:面向对象程序开发 31 -74 第四章:异常机制 74 -89 第五章:多线程技术 89 -122122122 第六章:常用类 API 122API 122 API 122API 122API 122API 122API 122-...

    asp网络编程学习笔记15章

    第十二章:错误处理与日志记录 - 错误处理策略:设置错误页面,记录错误信息。 - 日志系统:实现错误日志记录,便于排查问题。 第十三章:性能优化与安全防护 - 性能优化:缓存技术、数据库优化、代码优化。 - 安全...

    java8源码-ac_babel:一些后端学习笔记整理

    java8 源码 设计模式 java 并发 public class Foo { // SimpleDateFormat is not thread-safe, so give one to each thread private static final ThreadLocal formatter = new ThreadLocal(){ ...public

    AngularJs学习笔记.docx

    ### AngularJS 学习笔记 #### 一、AngularJS 概述 AngularJS 是一个用于构建动态Web应用的开源框架,由 Google 维护。它通过扩展 HTML 的功能来简化 Web 开发,并允许开发者以声明式的方式编写代码,极大地提高了...

    20余套微信小程序商城源代码(带后台源码) 含前端和后端.txt

    |- 在线小说 |- 云商城(带php后端) |- 语音日记本;php后端 |- 笑话集 ...|- 图书馆写笔记 |- 图片展示 |- 数码商城 |- 商城类完整demo:DFS:前端、PHP后端 |- 扫码借阅系统:PHP后端 |- 提取码: 2697

    JAVA学习笔记-第七章 面向对象中级(二)

    JAVA学习笔记-第七章 面向对象中级(二)

    2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip

    【资源说明】2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip2024届求职C++后端-学习笔记-操作...

Global site tag (gtag.js) - Google Analytics