理解 ajax、fetch和axios
背景
- 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
理解 ajax、fetch和axios的更多相关文章
- react中使用Ajax请求(axios,Fetch)
React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...
- 前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较
一.ajax.fetch 和 axios 简介 1.1.ajax ajax是最早出现发送后端请求的技术,属于原生 js .ajax使用源码,请点击<原生 ajax 请求详解>查看.一般使用 ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD【转】
转自:http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必 ...
- 通过回调函数的理解来进一步理解ajax及其注意的用法
一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...
- JavaScript大杂烩12 - 理解Ajax
AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下 ...
- 深入理解ajax系列第八篇——表单提交
前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD
真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必须要附加讲清楚git remote,git merge .远程repo, branch . commi ...
- 深入理解ajax系列第八篇
前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD(转)
转自http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必须 ...
随机推荐
- Java实例---简单的上课管理系统
源码分析 Course.java package com.ftl.many2many; import java.util.*; public class Course { private int cr ...
- 沉淀再出发:xml的意义和存在的价值
沉淀再出发:xml的意义和存在的价值 一.前言 学习了那么多的语言.框架.语法和基础知识,我们对于数据的理解或许有了一定的认识,但是如何描述.包装.传输.存储数据的手法和流程我们了解的或许并不多,其中 ...
- LAMP配置NFS页面共享,autofs实现挂载,DNS实现名称解析,纯手动操作
0.实验架构: 共6台服务器 分工如下: 服务器 职责 IP地址 Centos版本 描述 A DNS 172.18.7.70 7 B Apache 172.18.7.71 7 httpd+php-fp ...
- ZT C/C++变量命名规则,个人习惯总结
C/C++变量命名规则,个人习惯总结 (2012-10-31 13:48:10) 转载▼ 标签: c/c变量命名规则 c语言变量命名 c变量命名 规则规范 it 分类: C/VC C_C++变量命名规 ...
- Linux Min装机--配置JDK替换OpenJDK
@Linux Min装机--配置JDK替换OpenJDK 1.将下载的JDK压缩包解压到/usr/lib/jvm wil use : 一.文件复制命令cp 命令格式:cp [-adfilp ...
- CNN识别验证码1
之前学习python的时候,想尝试用requests实现自动登陆,但是现在网站登陆都会有验证码保护,主要是为了防止暴力破解,任意用户注册.最近接触深度学习,cnn能够进行图像识别,能够进行验证码识别. ...
- 20145314郑凯杰 《Java程序设计》第10周学习总结
20145314郑凯杰 <Java程序设计>第10周学习总结 代码托管: 学习内容总结 网络编程 会打手机吗? 第一个问题:会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛 ...
- momenta
编程:1.dp的题 2.白纸写代码,给一串数和一个目标值,使用四则运算和括号使得这串数最后计算结果为目标值,打印出所有的方案,要求是这些数每个最多被使用一次,可以不被用到. 3.考了一个查找数组里,未 ...
- [译] MVP模式的14条规则
笔者在前文<MVP和MVC>中提到了两者的区别,以及MVP日趋流行的原因:即随着各种给力UI框架的发布,View的功能越来越强,已经足以完成一些简单的不需要与后台或其他view交互的eve ...
- 利用JDK自带工具keyTool生成安全证书
前言:说一下最近做的工作,主要利用iText给网页中生成好的html报表转化为pdf格式的文件,并且在其中加入水印,数字签名等等,这部分主要介绍安全证书的目的就是为了做数字签名部分用的. 下面利用jd ...
.png?raw=true)