接口规范
随着前后端分离越来越普遍, 后端接口规范也就越来越重要了,一套良好的接口规范可以提升工作效率, 减少沟通障碍。通常我们都会采用RestfulApi方式来提供接口, 使用 JSON 来传输数据。
Restful设计规范有一个的要求
- 接口通信协议 http或https
- 接口域名 最好是独立解析的域名www.xxx.com
- 接口版本 将版本信息放在URL中 http://xxx/v1
- url路径 网络中的任何东西都为资源,均使用名词表示(一般为复数形式)
- 接口请求方式 GET/POST/PUT/DELTE等
GET :从服务器取出资源(一项或多项)
POST :在服务器新建一个资源
PUT/PATCH :在服务器更新资源
DELETE :从服务器删除资源
- 过滤信息 通过在url上传参的形式传递搜索条件
https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
- 状态码
200 OK - [GET]:服务器成功返回用户请求的数据。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
301:永久重定向
302:暂时重定向
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
返回结果以JSON数据返回
编写接口
const express = require('express') const query = require('./db') // 实例化一个http对象 const app = express() // 监听服务 app.listen(3000) // express就可以不用引入body-parser 工作时建议引入 // 接受JSON数据 content-type:application/json app.use(express.json()) // content-type:applocation/x-form-urlencoded id=1&name=aa ->解析 => querystring 或 qs app.use(express.urlencoded({ extended: false })) // 用户登录 app.post('/v1/api/login', async (req, res) => { const { username, password } = req.body // 查询用户是否存在 const sql = `select * from users where name='${username}' and password='${password}'` // 执行 如是查询不到数据返回空数据,查询到返回数组对象 const data = await query(sql) if (data.length == 0) { return res.status(401).send({ code: 1000, msg: '账号密码有误' }) }
// 账号和密码是存在的 把用户的状态存入到session中 ==》现在我们的是接口不在同一台服务器,cookie出问题
// session将无法保存用户状态
// jwt => json web token 在服务器端“加密”一个字符串,给客户端,客户端在后续的工作中,传过来给我,我在解密
// 验证是否正确,正确则继续后续工作,不正确停
// 加密 不能md5 不安全 admin=>xxxx 撞库 每次请求字符都不一样 非对称加密 rsa
// cnpm i -S jsonwebtoken
res.send(req.body)
})
接下来我们再写数据库文件db.js
const mysql = require('mysql') // 连接mysql 数据库连接池,性能更高 const db = mysql.createPool({ // 池子中可用的连扫数量 越多越好,但是你也根据服务器自己能力而行 // 默认值为10 connectionLimit: 10, // mysql服务器地址 host: '127,0,0,1', // 账号 user: 'root', // 密码 password: 'root', // 数据库名称 database: 'mydb' }) function query(sql){ return new Promise((resolve,reject) => { // error是否有错,null没有错,有值就有错 // results 取出的数据结果 数组 db.query(sql,(error,results)=>{ if(error){ reject(error) }else{ resolve(results) } }) }) } module.exports = query