# 第7章 前后端结合 - 项目整合后端接口
# 7-2 RESTful API 设计理念
[https://en.wikipedia.org/wiki/Representational_state_transfer](RESTful API)是目前比较成熟的一套互联网应用程序的API设计理论。 Endpoint
在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。
https://api.examples.com/teams
https://api.examples.com/players
Verb 动词
- GET(SELECT):从服务器取出资源(一项或多项)
- POST(CREATE):在服务器新建一个资源
- PUT(UPDATE):在服务器更新资源
- PATCH(UPDATE):在服务器更新资源
- DELETE(DELETE):从服务器删除资源
举例
// endpoints
https://api.example.com/teams
https://api.example.com/players
// verbs
GET /teams:列出所有球队
POST /teams:新建一个球队
GET /teams/ID:获取某个球队的信息
PUT /teams/ID:更新某个球队的信息(提供球队的全部信息)
PATCH /teams/ID:更新某个球队的信息(提供球队的部分信息)
{
name: 'new team name'
}
DELETE /teams/ID:删除某个球队
// 复杂结构 一对多
GET /teams/ID/players:列出某个指定球队的所有球员
// 常见状态码
200 OK - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
204 NO CONTENT - [DELETE]:用户删除数据成功。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作。
// 项目使用的 endpoints
GET /columns:列出所有专栏
GET /columns/ID:列出某个专栏的信息
GET /columns/ID/posts:列出某个专栏的所有文章
POST /columns/ID/posts 在某个专栏创建文章(需要权限)
GET /posts/ID: 列出某个文章的信息
POST /users/login 用户登录
GET /users/current 获取当前用户登录信息(需要权限)
# 7-3 使用 swagger在线文档查看接口详情
接口文档需要包括的点
- 第一 endponits,是具体的路径,或者说是网址。
- 第二 使用什么样的 method,get,post,put,patch 或者 delete
- 第三 发送请求要有什么样的参数,参数是在 url 上的 query还是 body 里面的复杂信息。
- 第四 请求返回的格式是什么样的。
如果使用文档,有可能是这样的
### endpoints
GET /teams/${ID}/players
### parameters
{
name: 'ID',
desc: '当前球队的 ID',
type: 'string'
}
### responses
**200响应**
{
"code": 0,
"data": [
{
"createdAt": "2020-06-05 16:45:22",
"description": "有一段非常有意思的简介,可以更新一下欧",
"name": "洛杉矶湖人",
"_id": "5eda0622acb0d2280c10385e"
},
{
"createdAt": "2020-06-05 16:45:22",
"description": "有一段非常有意思的简介,可以更新一下欧",
"name": "金州勇士",
"_id": "5eda0544ce65c327d718e57b"
}
],
"msg": "请求成功"
}
**401响应**
文档地址:(http://api.vikingship.xyz/)[http://api.vikingship.xyz/] 基于 (swagger)[https://swagger.io/]
# 7-4 axios 的基本用法和独家后端API 使用(必看) 7-5 后端Icode终极使用方案
地址:https://coding.imooc.com/lesson/449.html#mid=39379
慕课网提供的 Icode 经过几次升级,现在把最终的解决方案整理如下,供同学们参考。 可以在 main.ts 中的拦截器里面一劳永逸的添加。
// 替换 baseURL
axios.defaults.baseURL = 'http://apis.imooc.com/api/'
// 下面的 icode 值是从慕课网获取的 token 值,可以在课程右侧的项目接口校验码找到
axios.interceptors.request.use(config => {
... 其他代码
// get 请求,添加到 url 中
config.params = { ...config.params, icode: '******' }
// 其他请求,添加到 body 中
// 如果是上传文件,添加到 FormData 中
if (config.data instanceof FormData) {
config.data.append('icode', '******')
} else {
// 普通的 body 对象,添加到 data 中
config.data = { ...config.data, icode: '******' }
}
return config
})
# 7-6 使用vuex action 发送异步请求
官方文档地址:https://vuex.vuejs.org/zh/guide/actions.html
Action 类似于 mutation,不同在于:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
代码提交地址:https://git.imooc.com/coding-449/zheye/commit/216aa26136b6e4b6139a8806926b1d692c736dbd
# 7-7 使用vuex action 发送异步请求第二部分
代码提交地址:https://git.imooc.com/coding-449/zheye/commit/29922e606f0b58d6e77436e0032f42aa44bfebc6
# 7-8 使用 async 和 await 改造异步请求
async 和 await 是基基于promises的语法糖,使异步代码更易于编写和阅读。通过使用它们,异步代码看起来更像是老式同步代码,因此它们非常值得学习。
文档地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
代码示例:
// 例一
function hello() { return "Hello" };
hello();
async function hello() { return "Hello" };
hello();
hello().then((value) => console.log(value))
// 例二
async function hello() {
const greeting = await Promise.resolve("Hello");
return greeting
};
hello().then((value) => console.log(value));
代码提交地址:https://git.imooc.com/coding-449/zheye/commit/e2c40255bfe4d5aa24f0211f0660302026df3171
# 7-9 使用axios拦截器添加loading效果
Axios 拦截器文档地址:https://axios-http.com/docs/interceptors
axios.interceptors.request.use(config => {
store.commit('setLoading', true)
return config
})
axios.interceptors.response.use(config => {
store.commit('setLoading', false)
return config
})
# 7-10 7-11 Loader 组件编码
Bootstrap 提供的 Spinner:https://getbootstrap.com/docs/5.1/components/spinners/
Loader 第一部分编码地址:https://git.imooc.com/coding-449/zheye/commit/cd8a22fbaf8dd36ada4caaed880394603740edd2
Vue3 关于 Teleport 的官方文档:https://vuejs.org/guide/built-ins/teleport.html#basic-usage
Loader 第二部分编码地址:https://git.imooc.com/coding-449/zheye/commit/68b44a920a0b62d10f645cda0f013577f50eac55