【Express.js】处理请求数据

处理请求数据
本节将具体介绍后端处理请求源携带数据的一些方法和技巧
动态路径
很多时候我们需要处理一些类似但有操作差别或不同对象的业务,我们可以监听一段基本路径,将其中某一个段或者某几段路径作为变量,在接口中根据不同的路径变量执行不同的业务操作,这是一种REST风格比较鲜明的动态接口设计策略
实践
由于post也可以url传参,本节所有实例均采用post请求
第一个接口
这个接口以 //data/ 作为基路由,之后的kind变化的,在接口内部根据kind的值进行分支化处理 。我指定了kind的3个值:,和 body.
所有的路径参数则可以由req.(大概是个json对象)来获取,我要指定获取kind的值,就req..kind,而静态路径变量的值就等于它名字.
//忽略了express项目的创建和基本配置class Item {constructor(name, value) {this.name = name;this.value = http://www.kingceram.com/post/value;}}//启用json解析请求体app.use(express.json({type: 'application/json'}));app.post('/request/data/:kind', function (req, res) {let result = [];if (req.params.kind == 'PathVarible') {result.push(new Item("lesson","路径变量"));result.push(new Item("info","在express中叫做params,路径上每个被双单斜杠'/'隔开的一个个词语就是路径参数,当你需要在同一个接口内动态响应不同的情景时,可以让某一处或多出的路径参数前面加上一个冒号,长得比较像vue中的动态绑定,动态路径在REST风格上被广泛运行,比如操作某个用户: 'user/:id => 'user/1"))} else if (req.params.kind == 'RequestParam') {result.push(new Item("lesson","请求参数"));result.push(new Item("info","在express中叫做query,和路径变量相比,前者更像是前端主动携带参数去访问特定的资源,而后者更像是后端要求必须携带的数据,前端被迫携带,反应在路径上形式一般是: '/stu?class=2&sid=1&name='evanp',在基本路径之后添上一个问号,然后在后面加上请求的参数,不同参数之间用'&'符号隔开"))} else if (req.params.kind == 'body') {result.push(new Item("lesson","请求体"));result.push(new Item("info","路径变量和请求参数的数据都是透明的,这非常不注重隐私,因此更多时候前端应该将携带的数据放在请求体内进行传输 。请求体的形式有很多,最常用的是表单和JSON,请在路径后新增一个路径变量,form-urlencode, multi-form-data或json导向不同的接口进行查看"));} else {result.push(new Item("error","这个参数不认识"));}res.send(result);});
接口测试
请使用接口调试工具,带上路径查询参数(query),然后修改不同的kind为不同的值,去POST访问 :8080//data/kind,看看它们的返回结果,注意kind前不要加冒号了,冒号是用来让知道这段路径是可变的
第二个接口
当第一个接口的某一个分支还可以有后续的操作时,可以再开一个接口以它作为基路由,往后新增动态路径,比如我现在要让body可以再导向不同的分支,就再开一个 //data/body/:kind 接口
app.post('/request/data/body/:kind', function (req, res) {let result = [];if (req.params.kind == 'json') {result.push(new Item("lesson","json请求体"));result.push(new Item("body",req.body));result.push(new Item("info","express想解析json形式的body,必须先开启express.json: 'app.use(express.json)',之后就可以用req.body来接收请求体了"));result.push(new Item("trick","进阶技巧,读取请求体时可以用match模式匹配成自己想要的格式或命名,常用于实体注入及转化等"));} else if (req.params.kind == 'form-urlencode') {result.push(new Item("lesson","form-urlencode请求体"));result.push(new Item("body",req.body));} else if (req.params.kind == 'multi-form-data') {result.push(new Item("lesson","multi-form-data请求体"));result.push(new Item("body",req.body));} else {result.push(new Item("error","这个参数不认识"));}res.send(result);});