ajax
一、什么是ajax
?ajax
作用是什么?
ajax
全称是Asynchronous javascript and xml
(异步javascript
和XML
),是一种异步请求数据的web
开发技术;对于改善用户的体验和页面性能很有帮助
特点是在不需要重新刷新页面的情况下,ajax
通过异步请求加载后台数据,并在网上呈现出来;目的是提高用户体验,减少网络数据的传输量,由于ajax
请求的是数据而不是html
文档,节省了网络带宽,让用户浏览体验更顺畅
二、ajax
的原理是什么?
ajax
相当于在用户和服务器之间加了一个中间层,使用户和服务器响应异步化
原理是通过XmlHttpRequest
对象来向服务器发送异步请求,从服务器获取数据,然后通过javascript
来操作DOM
来更新页面
三、原生javascript
ajax
请求步骤有几个?
- 创建异步
XmlHttpRequest
对象 - 设置请求参数,包括
url
和方法等 - 发送请求(
send
方法) - 注册事件(
onreadystatechange
)事件,事件状态变更会及时响应监听 - 在监听里面获取并处理返回数据
四、ajax
有几种请求方式?优缺点?
get
、post
五、get
和post
请求数据的区别?
GET
在浏览器回退时是无害的,而POST
会再次提交请求。GET
产生的URL地址可以被Bookmark,而POST
不可以。GET
请求会被浏览器主动cache,而POST
不会,除非手动设置。GET
请求只能进行url
编码,而POST
支持多种编码方式。GET
请求参数会被完整保留在浏览器历史记录里,而POST
中的参数不会被保留。GET
请求在URL中传送的参数是有长度限制的,而POST
么有。- 对参数的数据类型,
GET
只接受ASCII字符,而POST
没有限制。 GET
比POST
更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。GET
参数通过URL传递,POST
放在Request body中。
GET
和POST
使用场景: 若符合下列任一情况,则推荐用POST
方法:
- 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
- 若使用
GET
方法,则表单上收集的数据可能让URL过长。 - 要传送的数据不是采用7位的ASCII编码。
若符合下列任一情况,则推荐用GET
方法:
- 请求是为了查找资源,HTML表单数据仅用来帮助搜索。
- 请求结果无持续性的副作用。
- 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符
axios
一、axios
是什么
axios
是一个基于promise
的http
库,支持promise
的所有api
,可以用在浏览器和node.js
中。前端最流行的ajax
请求库,react/vue
官方都推荐使用axios
发ajax
请求
二、axios
的特点
- 基于
promise
的异步ajax
请求库,支持promise
的所有api
- 浏览器端/
node
端都可以使用,浏览器中创建XMLHttpRequest
- 支持请求、响应拦截器
- 支持请求取消
- 可以转换请求数据和响应数据,并对想赢回来的内容自动转换成
JSON
类型的数据 - 可以批量发送多个请求
- 安全性更高,客户端支持防御
XSRF
,就是让你的每个请求都带一个从cookie
中拿到的key
,根据浏览器同源策略,假冒的网站是拿不到你cookie
中的key
的
三、axios
的常用方法
-
get
请求:axios.get('/user',{params:{id:123}})
-
post
请求:axios.post('/user',{name:'javan',age:18})
-
向
axios
传递相关配置来创建请求:axios(url[,config])
axios({ method:'post', url:'/user', data:{ firstName:'long', lastName:'ting' } })
config
配置-
url
:请求服务器的url
-
method
:请求方法,默认是get
-
baseURL
:自动加在url
前面,除非url
是一个绝对路径 -
data
:作为请求主体被发送的数据,只适用于put
、post
、patch
-
timeout
:指定请求超时的毫秒数 -
headers
:被发送的自定义请求头 -
withCredentials
:表示跨域请求时是否需要使用凭证,默认为false
-
responseType
:表示服务器响应的数据类型,默认是json
,可以是arraybuffer
、blob
、document
、text
、stream
-
proxy
:定义代理服务器的主机名称和端口proxy:{ host:'127.0.0.1', post:9000, auth:{ username:'kaka', password:'123' } }
请求拦截器:
axios.interceptors.request.use(function(config){})
响应拦截器:
axios.interceptors.response.use(function(response){})
-
四、axios
为什么既能在浏览器环境运行又能在服务器(node)环境运行
axios
在浏览器使用XMLHttpRequest
对象发送ajax
请求,在node
环境使用http
对象发送ajax
请求
var defaults.adapter = getDefaultAdapter()
function getDefaultAdapter(){
var adapter;
if(typeof XMLHttpRequest !== 'undefined'){
adapter = require('./adapter/xhr');
}else if(typeof process !== 'undefined'){
adapter = require('./adapter/http')
}
retrun adapter
}
从上面可以看出,XMLHttpRequest
是一个api
,它为客户端提供了客户端和服务器之间传输数据的功能
process
对象是一个global
全局变量,提供有关信息,控制当前node.js
进程
通过判断XMLHttpRequest
和process
这两个全局变量来判断程序的运行环境,从而在不同的环境中提供不同的http
请求模块,实现客户端和服务端程序的兼容
五、axios
相比原生ajax
的优点
ajax
相对缺点
ajax
是针对MVC
编程的,不符合现在前端的MVVM
浪潮,但axios
符合- 基于原生的
xhr
开发,xhr
本身的架构不清晰 jQuery
整个项目太大,单纯使用ajax
却要引入整个jQuery
非常不合理- 不符合关注分离原则
- 配置和调用非常混乱,而且基于事件的异步模型不友好