背景
  • ajax
  • fetch、axios
优缺点
  • ajax基于jquery,引入时需要引入庞大的jquery库,不符合当下前端框架,于是fetch替代了ajax

  • 由于fetch是比较底层,需要我们再次封装,比如data参数配置

    // jquery ajax
    $.post(url, {name: 'test'})
    // fetch
    fetch(url, {
    method: 'POST',
    body: Object.keys({name: 'test'}).map((key) => {
    return encodeURIComponent(key) + '=' + ncodeURIComponent(params[key]);
    }).join('&')
    })
  • fetch不支持超时控制,即timeout

详解axios

axios是什么

基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中

axios的特点

1. 从浏览器中创建 XMLHttpRequests
2. 从 node.js 创建 http 请求
3. 支持 Promise API支持 Promise API
4. 拦截请求和响应 (就是有interceptor,拦截器)
5. 转换请求数据和响应数据
6. 取消请求
7. 自动转换 JSON 数据
8. 客户端支持防御 XSRF

拦截器原理

兼容性

火狐 谷歌 ie Edge safari

安装

npm install axios

用法

//执行get请求
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
}); // Optionally the request above could also be done as
axios.get('/user', {
params: {
ID: 12345
}
}).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});

使用流程

//首先创建一个Axios实例
var axiosIns = axios.create({
baseURL: '请求地址',
timeout: 延时时长,
headers: {'X-product': 'h5'}
})
//设置request拦截器
axiosIns.interceptors.request.use(request=>{
//处理request,可以对所有请求统一处理请求头等
})
//response拦截器
axiosIns.interceptors.response.use(response=>{
//处理response,可以对所有响应做处理
}) //实例方法
axios#request(config)
axios#get(url[,config])
axios#delete(url[,config])
axios#head(url[,config])
axios#post(url[,data[,config]])
axios#put(url[,data[,config]])
axios#patch(url[,data[,config]]) //请求配置
{
baseURL: 'https://www.tomandjerry.club/api/',
url: '/user',
method: 'get',
//transformRequest 允许在向服务器发送前,修改请求数据,
//只能用在PUT POST PATCH 这几个请求方法中,
//后面的数组中的函数必须返回一个字符串,或ArrayBuffer,或Stream
transformRequst: [function(data){
//对data进行任意转换处理
return data;
}],
//transformResponse 在传递给then/catch 前,允许修改响应数据
transformResponse: [function(data){
//对data进行任意转换处理
}],
//自定义请求头
headers: {'X-Requested-With': 'XMLHttpRequest'},
//params 必须是一个 无格式对象 或 URLSearchParams对象
params: {
ID: 1234
},
//paramsSerializer 是负责params序列化的函数
//什么是序列化和反序列化,见下
paramsSerializer: function(params){
return Qs.strinfify(params,{arrayFormat: 'brackets'})
},
//data 主体的发送数据
//只适用于PUT POST 和PATCH
//在没有设置transformRequest时,必须是以下类型之一
//string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
//浏览器专属:FomData,File,Blob
//Node专属:Stream
data: {
firstName: 'Jack'
},
//timeout 请求超时,如果请求超过了timeout指定的时间则请求将被中断
timeout: 1000,
//表示跨域请求时是否需要使用凭证
withCredentials: false,//默认的
//adapter 允许自定义处理请求,使测试更轻松
//返回 一个promise并应用一个有效的响应
adapter: function(config){ },
//auth 表示应该使用HTTP基础验证,并提供凭据
//将设置一个Authorization头,覆写掉现有的任意使用headers设置的自定义Authorization头
auth: {
username: 'janedoe',
password: 'ssss'
},
//responseType 表示服务器响应的数据类型,
//可以是arraybuffer blob document json text stream
responseType: 'json',//默认
//xsrfCookieName 是用作xsrf token 的值的cookie的名称
xsrfCookieName: 'XSRF-TOKEN',//默认
//xsrfHeaderName 是承载xsrf token 的值的HTTP头的名称
xsrfHeaderName: 'X-XSRF-TOKEN', // 默认
//onUploadProgress 允许为上传处理进度事件
onUploadProgress: function(progressEvent){
// 对原生进度事件的处理
},
//onDownloadProgress 允许为下载处理进度事件
onDownloadProgress: function(progressEvent){
//对原生进度事件的处理
},
//maxContentLength 定义允许的响应内容的最大尺寸
maxContentLength: 2000,
//validateStatus 定义对于给定的HTTP 响应状态码是 resolve 或 reject
//如果validateStatus返回true(或者设置为 `null` 或 `undefined`),
//promise 将被 resolve; 否则,promise 将被 rejecte
validateStatus: function (status) {
return status >= 200 && status < 300; // 默认
},
//maxRedirects 定义在 node.js 中 follow 的最大重定向数目
// 如果设置为0,将不会 follow 任何重定向
maxRedirects: 5, // 默认的
//httpAgent和httpsAgent分别在node.js中用于定义在执行http和https 时使用的自定义代理。
//允许像这样配置选项:keepAlive默认没有启用
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
//proxy定义代理服务器的主机名称和端口,auth表示HTTP基础验证应当用于连接代理,并提供凭据
//这将会设置一个Proxy-Authorization头,
//覆写掉已有的通过使用header设置的自定义Proxy-Authorization头。
proxy: {
host: '127.0.0.1',
port: 9000,
auth: : {
username: 'mikeymike',
password: 'rapunz3l'
}
},
//cancelToken 指定用于取消请求的 cancel token
cancelToken: new CancelToken(function (cancel) { })
}
序列化

解释

在程序运行的过程中,所有变量都是存在内存中
d = dict(name='Bob', age=20, score=88)
可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,所有变量所占用的内存就会被操作系统回收,下次重新运行变量又被重新初始化为'Bob',我们把变量从内存中变成可储存或传输的过程称之为序列化。在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反之把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
参考

https://www.jianshu.com/p/065294e2711c

https://github.com/axios/axios

https://juejin.im/post/5acde23c5188255cb32e7e76

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143192607210600a668b5112e4a979dd20e4661cc9c97000

理解 ajax、fetch和axios的更多相关文章

  1. react中使用Ajax请求(axios,Fetch)

    React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...

  2. 前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较

    一.ajax.fetch 和 axios 简介 1.1.ajax ajax是最早出现发送后端请求的技术,属于原生 js .ajax使用源码,请点击<原生 ajax 请求详解>查看.一般使用 ...

  3. 真正理解 git fetch, git pull 以及 FETCH_HEAD【转】

    转自:http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必 ...

  4. 通过回调函数的理解来进一步理解ajax及其注意的用法

    一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...

  5. JavaScript大杂烩12 - 理解Ajax

    AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下 ...

  6. 深入理解ajax系列第八篇——表单提交

    前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...

  7. 真正理解 git fetch, git pull 以及 FETCH_HEAD

    真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必须要附加讲清楚git remote,git merge .远程repo, branch . commi ...

  8. 深入理解ajax系列第八篇

    前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...

  9. 真正理解 git fetch, git pull 以及 FETCH_HEAD(转)

    转自http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必须 ...

随机推荐

  1. Web前端——jQuery----细节

    jQuery终极思想:创建jQuery对象(当发现相同的选择器在你的代码里出现多次时,请用变量把它储存起来.一切面向对象) 认识jQuery 1.jQuery库可以做什么? HTML元素选取 HTML ...

  2. 列表:List<T>与HashSet和只读集合

    一.概述 List<T> 是ArrayList类的等效泛型类.属System.Collections.Generic命名空间. 二.声明及初始化 1.List<T> mList ...

  3. 安装批量装机工具cobbler过程

    首先想到的自然是yum install cobbler,结果找不到这个包,又懒得去官网下源码安装,于是乎想到增加第三方yum源,之后继续yum install cobbler,搞定. 然后启动cobb ...

  4. 9、Dubbo-配置(4)

    本地存根 远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端 也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等 等,此时就需 ...

  5. GPS-Graph Processing System Graph Coloring算法分析 (三)

        HamaWhite 原创,转载请注明出处!欢迎大家增加Giraph 技术交流群: 228591158     Graph coloring is the problem of assignin ...

  6. Kali-linux物理访问攻击

    物理访问攻击与提升用户的权限类似.即当一个普通用户登录到系统中,破解本地其他用户账户的密码.在Linux中,普通用户可以通过su命令代替其他用户执行某些操作,意味着该用户能够在Linux/Unix系统 ...

  7. ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)

    这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下.   row_number()over(partition by ...

  8. 使用Docker遇到的基本命令及问题小结

    当遇到Cannot connect to the Docker daemon. Is the docker daemon running on this host?导致Docker无法启动时,重启Do ...

  9. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )

    根据 上一篇 文章 , ETH  DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析  我们找到了   数据 的 ...

  10. 记一次jvm异常排查及优化

    为方便自己查看,根据工作遇到的问题,转载并整理以下jvm优化内容 有次接到客服反馈,生产系统异常,无法访问.接到通知紧急上后台跟踪,查看了数据库死锁情况--正常,接着查看tomcat 内存溢出--正常 ...