3-5 RESTful APIz最佳实践——增删改查应该返回什么响应?
3-1 路由简介
路由是什么?
- 决定了不同URL是如何不同地执行的
- 在 Koa中,是一个中间件
编写koa路由中间件
- 处理不同地URL
- 处理不同地HTTP 方法
- 解析 URL 地参数
const koa = require('koa')
const app = new koa()
app.use(async (ctx) => {
if (ctx.url === '/') {
ctx.body = '这是主页'
} else if (ctx.url === '/users') {
if (ctx.method === 'GET') {
ctx.body = '这是用户列表页'
} else if (ctx.method === 'POST') {
ctx.body = '创建用户'
} else {
ctx.status = 405
}
} else if (ctx.url.match(/\/users\/\w+/)) {
console.log(ctx.url.match(/\/users\/\w+/))
const userId = ctx.url.match(/\/users\/(\w+)/)[1]
ctx.body = `这是用户 ${userId}`
} else {
ctx.status = 404
}
})
app.listen(3000)
3-3 使用koa-router 实现路由
- 更优雅地实现路由基本功能
- 演示一些高级路由功能,如前缀,多中间件
安装
npm i koa-router --save
实现路由地基本功能
const koa = require('koa')
const Router = require('koa-router')
const app = new koa()
const router = new Router()
router.get('/', (ctx) => {
ctx.body = '这是主页'
})
router.get('/users', (ctx) => {
ctx.body = '这是用户列表'
})
router.post('/users', (ctx) => {
ctx.body = '创建用户'
})
router.get('/users/:id', (ctx) => {
ctx.body = `这是用户 ${ctx.params.id}`
})
app.use(router.routes())
app.listen(3000)
- const Router = require(‘koa-router’)
- const router = new Router()
- 编写路由
- 注册路由 app.use(router.routes())
嵌套路由’/users/:id’,通过ctx.paramas.id获取
高级路由功能
路由前缀
const koa = require('koa')
const Router = require('koa-router')
const app = new koa()
const router = new Router()
const usersRouter = new Router({prefix: '/users'})
router.get('/', (ctx) => {
ctx.body = '这是主页'
})
usersRouter.get('/', (ctx) => {
ctx.body = '这是用户列表'
})
usersRouter.post('/', (ctx) => {
ctx.body = '创建用户'
})
usersRouter.get('/:id', (ctx) => {
ctx.body = `这是用户 ${ctx.params.id}`
})
app.use(router.routes())
app.use(usersRouter.routes())
app.listen(3000)
- const usersRouter = new Router({prefix: ‘/users’})
- 编写路由
- app.use(usersRouter.routes()) 注册路由
多中间件路由
const koa = require('koa')
const Router = require('koa-router')
const app = new koa()
const router = new Router()
const usersRouter = new Router({prefix: '/users'})
const auth = async (ctx, next) => {
if (ctx.url !== '/users') {
ctx.throw(401)
}
await next()
}
router.get('/', (ctx) => {
ctx.body = '这是主页'
})
usersRouter.get('/', auth, (ctx) => {
ctx.body = '这是用户列表'
})
usersRouter.post('/', auth, (ctx) => {
ctx.body = '创建用户'
})
usersRouter.get('/:id', auth, (ctx) => {
ctx.body = `这是用户 ${ctx.params.id}`
})
app.use(router.routes())
app.use(usersRouter.routes())
app.listen(3000)
通过把中间件添加在路由中模拟权鉴。
3-4 http 中 options 方法的作用
- 检测服务器所支持的请求方法
这里的Allow的value即是支持的方法。 - CORS 中的预检请求
allowedMethods 的作用
app.use(usersRouter.allowedMethods())
-
响应 options 方法,告诉它所支持的请求方法
-
相应地返回405(不允许)与501(未实现)
3-5 RESTful APIz最佳实践——增删改查应该返回什么响应?
const koa = require('koa')
const Router = require('koa-router')
const app = new koa()
const router = new Router()
const usersRouter = new Router({prefix: '/users'})
router.get('/', (ctx) => {
ctx.body = '这是主页'
})
usersRouter.get('/', (ctx) => {
ctx.body =[{name: '李雷'}, {name: '韩梅梅'}]
})
usersRouter.post('/', (ctx) => {
ctx.body =[{name: '李雷'}]
})
usersRouter.get('/:id', (ctx) => {
ctx.body =[{name: '李雷2'}]
})
usersRouter.put('/:id', (ctx) => {
ctx.body =[{name: '李雷2'}]
})
usersRouter.delete('/:id', (ctx) => {
ctx.status = 204
})
app.use(router.routes())
app.use(usersRouter.routes())
app.use(usersRouter.allowedMethods())
app.listen(3000)
- 查询get
- 新建 post
- 修改 put
- 删除 delete
- 增、查、改返回一个数组,删返回204