Ajax及其应用

一、Ajax工作原理

Ajax(Asynchronous JavaScript and XML):异步的js和XML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

  1. Ajax提供与服务器异步通信的能力,可在web页面触发js事件中中服务器发出异步请求,如执行更新或查询数据库

  1. Ajax的核心是js对象XMLHttpRequest,改对象在IE5中首次引入,使用户通过js向服务器提出请求并处理相应,不阻塞用户

  1. 当web服务器的相应返回时,使用js回调函数和CSS相应的更新页面的局部页面,而不是刷新整个页面

  1. 在页面与服务器交互的过程中不中断用户操作,用户甚至察觉不到浏览器正在与服务器进行通信

二、XMLHttpRequest对象的属性

常用的三个属性:

1.onreadystatechange 属性

onreadystatechange 属性存有处理服务器响应的函数。

下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行设置:

xmlHttp.onreadystatechange = function() {
    //我们需要在这写一些代码
}
2.readyState 属性

readyState 属性存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会被执行。

readyState 属性可能的值:

状态

描述

0

请求未初始化(在调用 open() 之前)

1

请求已提出(调用 send() 之前)

2

请求已发送(这里通常可以从响应得到内容头部)

3

请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应)

4

请求已完成(可以访问服务器响应并使用它)

我们要向这个 onreadystatechange 函数添加一条 If 语句,来测试我们的响应是否已完成(意味着可获得数据):

xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
        //从服务器的response获得数据
    }
}
3.responseText 属性

可以通过 responseText 属性来取回由服务器返回的数据。

在我们的代码中,我们将把时间文本框的值设置为等于 responseText:

xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
        document.myForm.time.value = xmlHttp.responseText;
    }
}
4.其他属性

属性

描述

onreadystatechange

状态改变的事件触发器,每个状态改变时都会触发这个事件处理器,通常会调用一个JavaScript函数

readyState

请求的状态。有5个可取值:0=未初始化,1=正在加载,2=已加载,3=交互中,4=完成

responseText

服务器的响应,返回数据的文本。

responseXML

服务器的响应,返回数据的兼容DOM的XML文档对象,这个对象可以解析为一个DOM对象。

responseBody

服务器返回的主题(非文本格式)

responseStream

服务器返回的数据流

status

服务器的HTTP状态码(如:404 ="文件末找到”、200 ="成功”,等等)

statusText

服务器返回的状态文本信息,HTTP状态码的相应文本(OK或Not Found(未找到)等等)

三、XMLHttpRequest 方法
1.open() 方法

open() 有三个参数。第一个参数定义发送请求所使用的方法,第二个参数规定服务器端脚本的URL,第三个参数规定应当对请求进行异步地处理。

xmlHttp.open("GET","test.php",true);
2.send() 方法

send() 方法将请求送往服务器。如果我们假设 HTML 文件和 PHP 文件位于相同的目录,那么代码是这样的:

xmlHttp.send(null);
3.其他方法

方法

描述

abort()

停止当前请求

getAllResponseHeaders()

把HTTP请求的所有响应首部作为键/值对返回

getResponseHeader("header")

返回指定首部的串值

open("method" , "URL",[asyncFlag],["userName"],["password"])

建立对服务器的调用。method参数可以是GET、POST或PUT。url参数可以是相对URL或绝对URL。这个方法还包括3个可选的参数,是否异步,用户名,密码

send(content)

向服务器发送请求

setRequestHeader("header" , "value")

把指定首部设置为所提供的值。在设置任何首部之前必须先调用open()。设置header并和请求一起发送('post'方法—定要)

四、XMLHttpRequest 的事件回调

事件

触发条件

onreadystatechange

每当xhr.readyState改变时触发;但xhr.readyState由非 0 值变为 0 时不触发。

onloadstart

调用xhr.send()方法后立即触发,若xhr.send()未被调用则不会触发此事件。

onprogress

xhr.upload.onprogress在上传阶段(即xhr.send()之后,xhr.readystate=2之前)发,每 50ms 触发一次;xhr.onprogress在下载阶段(即xhr.readystate=3时)触发,每 50ms 触发一次。

onload

当请求成功完成时触发,此时xhr.readystate=4

onloadend

当请求结束(包括请求成功和请求失败)时触发

onabort

当调用xhr.abort()后触发

ontimeout

xhr.timeout不等于 0 ,由请求开始即 onloadstart 开始算起,当到达xhr.timeout 所设置时间请求还未结束即 onloadend ,则触发此事件。

onerror

在请求过程中,若发生 Network error 则会触发此事件(若发生 Network error 时,上传还没有结束,则会先触发 xhr.upload.onerror,再触发 xhr.onerror ;若发生 Network error 时,上传已经结束,则只会触发

xhr.onerror )。注意,只有发生了网络层级别的异常才会触发此事件,对于应用层级别的异常,如响应返回的xhr.statusCode是 4xx 时,并不属于 Network error,所以不会触发 onerror事件,而是会触发 onload事件。

请求正常时,事件触发顺序

  1. 触发 :xhr.onreadystatechange (之后每次 readyState 变化时,都会触发一次)

  1. 触发 xhr.onloadstart //上传阶段开始:

  1. 触发 xhr.upload.onloadstart

  1. 触发 xhr.upload.onprogress

  1. 触发 xhr.upload.onload

  1. 触发 xhr.upload.onloadend //上传结束,下载阶段开始:

  1. 触发 xhr.onprogress

  1. 触发 xhr.onload

  1. 触发 xhr.onloadend

发生 abort / timeout / error 时事件触发顺序

  1. 触发 xhr.onreadystatechange 事件,此时 readystate 为 4

  1. 如果上传阶段还没有结束,则依次触发以下事件:

  • xhr.upload.onprogress

  • xhr.upload.[onabort或ontimeout或onerror]

  • xhr.upload.onloadend

  1. 触发 xhr.onprogress 事件

  1. 触发 xhr.[onabort或ontimeout或onerror] 事件

  1. 触发 xhr.onloadend 事件

五、JSONPlaceHolder常用的六个方法

jsonplaceholder——免费的HTTP请求假数据接口。

  1. /posts , 获取100个json格式数据

请求地址: https://jsonplaceholder.typicode.com/posts

代码示例

import requests
def send_request():
    # GET https://jsonplaceholder.typicode.com/posts
    try:
        response = requests.get(
            url="https://jsonplaceholder.typicode.com/posts",
        )
        print('Response HTTP Status Code: {status_code}'.format(
            status_code=response.status_code))
        print('Response HTTP Response Body: {content}'.format(
            content=response.content))
    except requests.exceptions.RequestException:
        print('HTTP Request failed')

返回结果(100条)

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "qui est esse",
    "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
  },
  {
    "userId": 1,
    "id": 3,
    "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
    "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
  },
  .....
  .....
2. /comments 获取500条数据

请求地址: https://jsonplaceholder.typicode.com/comments

返回数据格式:

[
  {
    "postId": 1,
    "id": 1,
    "name": "id labore ex et quam laborum",
    "email": "Eliseo@gardner.biz",
    "body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium"
  },
  {
    "postId": 1,
    "id": 2,
    "name": "quo vero reiciendis velit similique earum",
    "email": "Jayne_Kuhic@sydney.com",
    "body": "est natus enim nihil est dolore omnis voluptatem numquam\net omnis occaecati quod ullam at\nvoluptatem error expedita pariatur\nnihil sint nostrum voluptatem reiciendis et"
  },
  {
    "postId": 1,
    "id": 3,
    "name": "odio adipisci rerum aut animi",
    "email": "Nikita@garfield.biz",
    "body": "quia molestiae reprehenderit quasi aspernatur\naut expedita occaecati aliquam eveniet laudantium\nomnis quibusdam delectus saepe quia accusamus maiores nam est\ncum et ducimus et vero voluptates excepturi deleniti ratione"
  },
3. /albums 获取100条 albums数据

请求地址: https://jsonplaceholder.typicode.com/albums

返回数据格式:

[
  {
    "userId": 1,
    "id": 1,
    "title": "quidem molestiae enim"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "sunt qui excepturi placeat culpa"
  },
  {
    "userId": 1,
    "id": 3,
    "title": "omnis laborum odio"
  },
  {
    "userId": 1,
    "id": 4,
    "title": "non esse culpa molestiae omnis sed optio"
  },
  {
    "userId": 1,
    "id": 5,
    "title": "eaque aut omnis a"
  },
4. /photos 获取 5000个photos

请求地址: https://jsonplaceholder.typicode.com/photos

返回数据格式:

[
  {
    "albumId": 1,
    "id": 1,
    "title": "accusamus beatae ad facilis cum similique qui sunt",
    "url": "https://via.placeholder.com/600/92c952",
    "thumbnailUrl": "https://via.placeholder.com/150/92c952"
  },
  {
    "albumId": 1,
    "id": 2,
    "title": "reprehenderit est deserunt velit ipsam",
    "url": "https://via.placeholder.com/600/771796",
    "thumbnailUrl": "https://via.placeholder.com/150/771796"
  },
  {
    "albumId": 1,
    "id": 3,
    "title": "officia porro iure quia iusto qui ipsa ut modi",
    "url": "https://via.placeholder.com/600/24f355",
    "thumbnailUrl": "https://via.placeholder.com/150/24f355"
  },
5. /todos 获取 200个todos

请求地址: https://jsonplaceholder.typicode.com/todos

返回内容格式:

[
  {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
  {
    "userId": 1,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": false
  },
  {
    "userId": 1,
    "id": 3,
    "title": "fugiat veniam minus",
    "completed": false
  },
6. /users 获取10个users

请求地址: https://jsonplaceholder.typicode.com/users

返回数据格式:

[
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "Shanna@melissa.tv",
    "address": {
      "street": "Victor Plains",
      "suite": "Suite 879",
      "city": "Wisokyburgh",
      "zipcode": "90566-7771",
      "geo": {
        "lat": "-43.9509",
        "lng": "-34.4618"
      }
    },
    "phone": "010-692-6593 x09125",
    "website": "anastasia.net",
    "company": {
      "name": "Deckow-Crist",
      "catchPhrase": "Proactive didactic contingency",
      "bs": "synergize scalable supply-chains"
    }
  },

参考资料:1.介绍一个在线fake平台JSONPlaceholder_fake网站_Flutter&Python&Test的博客-CSDN博客 2.XMLHTTPRequest属性、方法、事件大全&详解_xmlhttprequest 事件_huang100qi的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值