ToB企服应用市场:ToB评测及商务社交产业平台

标题: Ajax day-01 [打印本页]

作者: 愛在花開的季節    时间: 2024-9-1 08:18
标题: Ajax day-01
目次
一. Ajax
1.1 创建XMLHttpRequest对象
1.2 Ajax向服务器发送请求
1.3 设置http请求头
1.4 发送请求
1.5 获得相应
1.6 监听请求状态的改变
1.7 获取相应头
1.8 获得相应主体
1.9 处理服务器返回的数据
1.10 怎样向服务器通报数据?
二. 接口文档
三. 开发模式
3.1 前后端混淆
3.2 前后端分离
3.3 跨域和同源计谋
3.4 JSONP实现跨域请求


一. Ajax

Ajax是Asynchronous Javascript And XML(异步JavaScript和XML)的缩写。
Ajax技能形貌了使用脚本操纵HTTP和Web服务器举行数据交换,在页面不刷新的环境下,实现页面的局部更新。
   重点:
  
  


1.1 创建XMLHttpRequest对象

欣赏器在XMLHttpRequest类上界说了它的HTTP方法。这个范例的每个实例都表示一个独立的请求/相应对,并且这个对象的属性和方法允许指定请求细节和获取相应数据。
创建XMLHttpRequest对象:
  1. var xhr = new XMLHttpRequest();
复制代码
  回忆:
  一个HTTP请求由4部分组成:
  
  1.2 Ajax向服务器发送请求

创建XMLHttpRequest对象之后,我们就可以使用XMLHttpRequest对象的open()方法发起请求,该方法必须要指定请求方法(GET、POST等)和URL。
  1. xhr.open("GET", "home.html");
  2. xhr.open('method', 'URL' [, asyncFlag [, 'userName' [, 'password']]])
复制代码

注意:
同步和异步的区别:是否阻塞代码的实行。
异步方式(默认):好坏阻塞的,欣赏器端的JavaScript程序不消等待Web服务器相应,可以继承处理其他事情。当服务器相应后,再来处理Ajax对象获取到的相应结果。下面请看异步的实行过程,

同步方式:是阻塞的,当Ajax对象向Web服务器发送请求后,会等待Web服务器相应的数据吸收完成,再继承实行后面的代码。

1.3 设置http请求头

除了设置请求方法和URL以外,我们还可以设置请求头。POST请求一样平常是要用"Content-Type"请求头指定请求主体的MIME范例(用来形貌实体内容的编码格式):
  1. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//默认编码格式(数据被编码为名称/值对)
  2. xhr.setRequestHeader("Content-Type", "application/json");//用来告诉服务端消息主体是序列化后的 JSON 字符串
复制代码
扩展阅读:Form表单的编码范例

但是有些请求头我们不能自己指定,例如"Content-Length"、"Date"、"Referer"、"User-Agent"等,XMLHttpRequest将自动添加这些头,防止伪造它们。除此之外,XMLHttpRequest对象自动处理Cookie、连接时间、字符集和编码判断,所以我们无法向setRequestHeader()通报如下的请求头:
Accept-CharsetContent-Transfer-EncodingTEAccept-EncodingDateTrailerConnectionExpectTransfer-EncodingContent-LengthHostUpgradeCookieKeep-aliveUser-AgentCookie2RefererVia 1.4 发送请求

使用XMLHttpRequest发起请求的最后一步是指定可选的请求主体并将它发送给服务器。
  1. xhr.send(content);//Open的方式是post
  2. xhr.send(null);//open的方式是get的一般不用send
  3. //xhr.send('clazz=火花&name=张三&gender=男');
复制代码
GET请求没有请求体,所以应该通报null或省略这个参数。而POST请求通常具有请求主体,同时它应该与使用setRequestHeader()指定的"Content-Type"划一。
1.5 获得相应

一个完整的HTTP相应消息由状态行、相应头、空行和相应主体组成。这些都可以通过XMLHttpRequest对象的方法和方法获取。

1.6 监听请求状态的改变

为了在相应准备就绪时得到通知,必须监听XMLHttpRequest对象上的onreadystatechange事件。
  1. xhr.onreadystatechange = function(){
  2. };
复制代码
但为了理解这个事件范例,我需要先弄明确readyState属性。readyState属性的值是一个整数,用来指示HTTP请求的状态。readyState属性的值如下表所示:
常量含义UNSENT0初始化,尚未调用open()方法OPENED1启动,已调用open()方法,但尚未调用send()方法HEADERS_RECEIVED2发送,已调用send()方法,吸收到相应头信息LOADING3吸收中,已经吸收到部分相应主体DONE4完成,已经吸收到全部相应数据,而且已经可以在客户端使用了 在实际应用中,当readyState属性的值改变为0或1时可能不会触发这个事件。当readyState属性的值改变为4或服务器的相应完成时,全部的欣赏器都会触发readystatechange事件。因此为了判断相应是否真正完成了,我们应该在事件处理程序中时间检测readyState属性的值。
  1. xhr.onreadystatechange = function(){
  2. if (xhr.readyState === 4) {
  3.         console.log("请求完成了");
  4.     }
  5. };
复制代码
但这样只能确保请求完成了,并不能确保请求成功。因此我们还需要根据相应的【状态码】来判断请求是否成功。
我们可以通过XMLHttpRequest对象的status和statusText属性获取HTTP状态码,状态消息。
  1. xhr.status       // 200
  2. xhr.statusText   // OK
复制代码
代码如下:
  1. xhr.onreadystatechange = function(){
  2. if (xhr.readyState === 4 && xhr.status === 200) {
  3.         console.log("请求完成并且成功了");
  4.     }
  5. };
复制代码
完善的判断信息
  1. xhr.onreadystatechange = function(){
  2.     if (xhr.readyState === 4) {
  3.             if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
  4.                 alert(xhr.responseText);
  5.             } else {
  6.                 alert("Request was unsuccessful: " + xhr.status);
  7.             };
  8.         };
  9. };
复制代码


1.7 获取相应头


  1. xhr.getResponeHeader("Content-Type")      // "text/html"
  2. xhr.getAllResponeHeaders()              // 获取所有的响应头
复制代码
1.8 获得相应主体

服务器的相应实体内容有多重编码格式,当用户请求的是一个网页,实体内容的格式就是HTML,如果请求的是图片相应的就是图片,服务器为了告知欣赏器内容范例,会通过相应头中的Content-type字段来形貌,这是一种MIME常见的范例。
无论相应主体内容范例是什么,相应主体的内容都会生存到responseText和responseXML属性中;而对于非XML数据而言responseXML属性的值将为null。
  1. xhr.responseText     // 服务器端返回的文本内容
复制代码
1.9 处理服务器返回的数据

服务器返回的数据都是JSON格式的字符串,为了使用方便,我们需要先把字符串转换成JavaScript对象(Object/Array)。
  1. JSON.parse(xhr.responseText);
复制代码
转换之后,就能以访问对象属性的方式拿到各种数据,实例如下:
  1. // 转换成Object类型的对象
  2. [{"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"}]
  3. // 转换成Array类型的对象
  4. [
  5. {"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"},
  6. {"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"},
  7. {"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"},
  8. {"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"}
  9. ]
复制代码
1.10 怎样向服务器通报数据?

GET方式的请求:
通报给后台的数据要拼接到URL的后面,以问号(?)开始,参数是以name=value的情势出现,每两个键值对之间以(&)分隔。例如:
  1. 'http://192.168.0.101:8080/AjaxDemo/LoginServlet?username=zhangsan&password=123456'
复制代码
POST方式的请求:
先通过请求头(Content-Type)指定命据的格式范例,常用的格式范例有两种,分别是:

  1.   
  2. 然后将编码之后的数据通过send()方法传递给服务器,例如:
  3. xhr.send(“clazz=%E7%81%AB%E8%8A%B112%E6%9C%9F&name=%E9%99%88%E6%A2%A6%E9%BE%99&gender=%E7%94%B7&age=20&hobby=%E7%9D%A1%E8%A7%89&hobby=%E6%89%93%E8%B1%86%E8%B1%86&tel=13834569928&address=%E5%8D%97%E9%98%B3&remark=%E6%96%B0%E5%90%8C%E5%AD%A6&date=2019-08-01”)。
复制代码
二. 接口文档

在实际的项目开发中,后台服务写好之后,后台职员会给前台职员一份【接口文档】,文档中列出了每个功能所需要的接口信息,我们前台职员只需要根据文档的要求与服务器举行数据交互即可。接口文档示例如下:
接口请求方式作用请求参数/api/student/getStudentGET1、获取全部学生信息 2、根据ID获取学生信息 3、根据name获取学生信息可选参数: id 学生ID name 学生姓名/api/student/removeStudentGET1、根据ID删除学生信息必传参数: id 学生ID/api/student/addStudentPOST1、添加学生信息必传参数: clazz班级 name 姓名 gender 性别 age 年龄 tel 电话 address 地点信息 remark 备注信息/api/student/updateStudentPOST1、更新学生信息必传参数:id 学生ID clazz班级 name 姓名 gender 性别 age 年龄 tel 电话 address 地点信息 remark 备注信息** 三. 开发模式

3.1 前后端混淆

前端代码与后台代码混淆编写,也就是说前端代码和后台代码同时出如今一个文件中。例如,index.php文件是由PHP代码和HTML代码混写的:
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <?php
  5. $x=5; // global scope
  6. function myTest() {
  7.    $y=10; // local scope
  8.    echo "<p>在函数内部测试变量:</p>";
  9.    echo "变量 x 是:$x";
  10.    echo "<br>";
  11.    echo "变量 y 是:$y";
  12. }
  13. myTest();
  14. echo "<p>在函数之外测试变量:</p>";
  15. echo "变量 x 是:$x";
  16. echo "<br>";
  17. echo "变量 y 是:$y";
  18. ?>
  19. </body>
  20. </html>
  21. //再例如,index.jsp是由 Java代码和HTML代码混写的:
  22. <%@ page language="java" contentType="text/html; charset=UTF-8"
  23.     pageEncoding="UTF-8"%>
  24. <html>
  25. <head>
  26. <title>life.jsp</title>
  27. </head>
  28. <body>
复制代码
在前后端不分离的时代,在项目开发阶段,前端职员负责编写HTML页,后端职员负责写接口,前端职员调试页面动态数据都需要后端职员的共同,不能单独调试,耗时耗力。前端把前后端代码存放于同一个代码库中,乃至是同一工程目次下。页面中还混淆着后端代码。前后端工程师举行开发时,都必须把整个项目导入到开发工具中。

3.2 前后端分离

随着时代的发展,渐渐的许多大中小公司开始把前后端的边界分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情。


前端资源和后台接口位于同一个服务器


前台资源和后台接口分别位于不同的服务器(跨域)

3.3 跨域和同源计谋

例如【前后端分离情形二】欣赏器不允许一个服务器中的页面向另一个服务器发送请求,错误信息如下:

我们通常称这种范例的请求叫跨域请求
为什么会跨域呢?

那什么是同源计谋呢?
是指协议,域名,端标语雷同就称为同源,同源的请求是允许的,如果非同源,那么在请求数据时,欣赏器会在控制台中报一个异常,提示拒绝访问,就造成了跨域。
那怎么样办理这个问题呢?
为使受信托的网站之间可以大概跨域访问,HTML5提供了一个新的计谋,就是Access-Control-Allow-Origin相应头。目标服务器通过该相应头可以指定允许来自特定URL的跨域请求,其值可以设置为恣意URL或特定URL等。
实现方式有:
1、通过设置后台服务器允许跨域请求
2、JSONP
3、使用署理服务器
4、前台使用署理
3.4 JSONP实现跨域请求

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。我们可以通过使用 html的script标志来举行跨域请求,并在相应中返回要实行的script代码,此中可以直接使用JSON通报javascript对象。这种跨域的通讯方式称为JSONP。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4