json-serve可以快速搭建一个具有RESTful风格的后台服务器,为前端提供后台的接口和数据的调用。
json-serve官网:json-serve
npm install -g json-server
db.json
,用于存放前台要调用的数据{
"posts": [
{
"id": 1, "title": "json-server", "author": "typicode" }
],
"comments": [
{
"id": 1, "body": "some comment", "postId": 1 }
],
"profile": {
"name": "typicode" }
}
json-server --watch db.json
4.访问http://localhost:3000/posts/1,你会得到
{
"id": 1, "title": "json-server", "author": "typicode" }
db.json
文件中{"name": "Foobar"}
)db.json
文件中定义的键的值。axios官网:axios
基本使用1:记得导入axios包
<html lang="en">
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<title>Axios基本使用title>
head>
<body>
<div class="container">
<h2 class="page-header">Axios基本使用h2>
<button class="btn btn-primary">发送GET请求button>
<button class="btn btn-warning">发送POST请求button>
<button class="btn btn-success">发送PUT请求button>
<button class="btn btn-danger">发送DELETE请求button>
div>
<script>
//获取按钮
const btn = document.querySelectorAll('button');
//发送ajax请求,类型为GET
//从服务度获取指定id的json数据
btn[0].onclick = function() {
axios({
method: 'get',
url: 'http://localhost:3000/posts/3'
}).then((result) => {
console.log(result)
});
}
//发送ajax请求,类型为POST
//添加一条数据
btn[1].onclick = function() {
axios({
method: 'post',
url: 'http://localhost:3000/posts',
data: {
title: "朱阳策", author: "沈峤" }
}).then((result) => {
console.log(result)
});
}
//发送ajax请求,类型为PUT
//修改指定id的数据
btn[2].onclick = function() {
axios({
method: 'put',
url: 'http://localhost:3000/posts/2',
data: {
title: "朱阳策", author: "沈峤" }
}).then((result) => {
console.log(result)
});
}
//发送ajax请求,类型为Delete
//删除指定id的数据
btn[3].onclick = function() {
axios({
method: 'delete',
url: 'http://localhost:3000/posts/3',
}).then((result) => {
console.log(result)
});
}
script>
body>
html>
基本使用2
<html lang="en">
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<title>Axios基本使用title>
head>
<body>
<div class="container">
<h2 class="page-header">基本使用h2>
<button class="btn btn-primary">发送GET请求button>
<button class="btn btn-warning">发送POST请求button>
<button class="btn btn-success">发送PUT请求button>
<button class="btn btn-danger">发送DELETE请求button>
div>
<script>
//获取按钮
const btn = document.querySelectorAll('button');
//发送ajax请求,类型为get
//获取指定id的数据
btn[0].onclick = function() {
axios.request({
method: 'get',
url: 'http://localhost:3000/posts/3'
}).then((result) => {
console.log(result)
});
}
//发送ajax请求,类型为POST
//添加一条数据
btn[1].onclick = function(){
axios.post('http://localhost:3000/comments',
{
body: "上阳",
postId: 1
}).then((result) => {
console.log(result)
})
}
//发送ajax请求,类型为PUT
//修改指定id的数据
btn[2].onclick = function() {
axios.put('http://localhost:3000/posts/2',
{
title: "天天", author: "沈峤"
}).then((result) => {
console.log(result)
});
}
//发送ajax请求,类型为Delete
//删除指定id的数据
btn[3].onclick = function() {
axios.delete('http://localhost:3000/posts/3').then((result) => {
console.log(result)
});
}
script>
body>
html>
<html lang="en">
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<title>axios的默认配置title>
head>
<body>
<div class="container">
<h2 class="page-header">axios的默认配置h2>
<button class="btn btn-primary">发送GET请求button>
div>
<script>
//获取按钮
const btn = document.querySelectorAll('button');
//配置axios的默认配置,使用默认的配置可以减少url的地址,和一些重复的基础配置
axios.defaults.baseURL = 'http://localhost:3000/'
axios.defaults.method = 'get'
axios.defaults.params = {
id:1}
axios.defaults.timout = 3000
//发送ajax请求,类型为get
btn[0].onclick = function() {
axios.request({
url: '/posts'
}).then((result) => {
console.log(result)
});
}
script>
body>
html>
<html lang="en">
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<title>创建Axios对象title>
head>
<body>
<div class="container">
<h2 class="page-header">创建Axios对象h2>
<button class="btn btn-primary">发送GET请求button>
div>
<script>
//获取按钮
const btn = document.querySelectorAll('button');
//创建axios对象,并配置基本的配置
const instance = axios.create({
baseURL: 'http://localhost:3000/',
timeout: 2000
});
//发送ajax请求,类型为get
btn[0].onclick = function() {
//使用创建的对象来发送get请求
instance.get('/posts').then(result => {
console.log(result)
})
}
script>
body>
html>
<html lang="en">
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<title>axios拦截器title>
head>
<body>
<div class="container">
<h2 class="page-header">axios拦截器h2>
<button class="btn btn-primary">发送GET请求button>
div>
<script>
// 添加一个请求拦截器,config为请求的全部配置,包括请求的数据,可以对请求数据做校验和格式化请求数据
axios.interceptors.request.use(function (config) {
console.log('请求拦截器 成功-1')
//throw "参数异常"
//加入请求参数
config.params = {
id:2}
return config;
}, function (error) {
//失败回调
consolel.log("请求拦截器 失败-1")
return Promise.reject(error);
});
axios.interceptors.request.use(function (config) {
console.log('请求拦截器 成功-2')
//throw "参数异常"
//设置响应时间
config.timeout = 2000
return config;
}, function (error) {
consolel.log("请求拦截器 失败-2")
return Promise.reject(error);
});
//添加一个响应拦截器,response为响应的数据,包括响应的数据,可以使用响应拦截器做返回数据的格式化
axios.interceptors.response.use(function (response) {
console.log('响应拦截器 成功-1')
return response.data;
//return response;
}, function (error) {
//失败回调
console.log('响应拦截器 失败-1')
return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
console.log('响应拦截器 成功-2')
return response;
}, function (error) {
//失败回调
console.log('响应拦截器 失败-2')
return Promise.reject(error);
});
//获取按钮
const btn = document.querySelectorAll('button');
//发送ajax请求,类型为get
btn[0].onclick = function() {
axios({
method: 'get',
url: 'http://localhost:3000/posts',
}).then(result => {
console.log('最终结果如下:')
console.log(result)
}).catch(reason =>{
console.log('异常结果如下:')
console.log(reason)
})
}
script>
body>
html>
请求拦截器是后进先调用,响应拦截器是先进先调用。
如果请求拦截器-1中的请求出现异常,控制台打印结果如下:
到达请求拦截器-1抛出参数异常后,就会直接调用响应拦截器-1的失败回调方法,返回一个Promis对象后在调用响应拦截器-2的失败回调方法,最后给调用者捕获异常后输出异常信息。
基本流程
配置 cancelToken 对象
缓存用于取消请求的 cancel 函数
在后面特定时机调用 cancel 函数取消请求
在错误回调中判断如果 error 是 cancel,做相应处理
实现功能
json-serve配置响应的一个延时,便于取消请求,否则一发请求就立马响应,来不及取消请求,配置命令如下:
<html lang="en">
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js">script>
<title>Axios基本使用title>
head>
<body>
<div class="container">
<h2 class="page-header">axios取消请求h2>
<button class="btn btn-primary">发送请求button>
<button class="btn btn-warning">取消请求button>
div>
<script>
//获取按钮
const btn = document.querySelectorAll('button');
//定义一个全局变量
let cancel = null;
//发送ajax请求,类型为get
btn[0].onclick = function() {
if(cancel != null){
//处理用户连续点击,服务器压力问题,每次先判断,之前的请求是否完成,没有就取消请求重新发送请求
//取消上一次的请求
cancel();
}
axios({
method: 'get',
url: 'http://localhost:3000/posts',
//配置cancelToken对象,并给定义的全局变量赋值
cancelToken: new axios.CancelToken(function(c){
cancel = c;
})
}).then(result => {
cancel = null;
console.log('最终结果如下:')
console.log(result)
})
}
//绑定取消点击事件
btn[1].onclick = function(){
//调用定义的全局变量的方法,名称要相同
cancel();
}
script>
body>
html>
/配置cancelToken对象,并给定义的全局变量赋值
cancelToken: new axios.CancelToken(function(c){
cancel = c;
})
}).then(result => {
cancel = null;
console.log('最终结果如下:')
console.log(result)
})
}
//绑定取消点击事件
btn[1].onclick = function(){
//调用定义的全局变量的方法,名称要相同
cancel();
}
script>
body>
html>