浅谈Express.js解析Post数据类型的正确姿势
作者:我是你的超级英雄 发布时间:2024-06-05 09:52:18
一、概念介绍
1、POST请求:HTTP/1.1
协议规定的 HTTP
请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT
这几种。其中 POST
一般用来向服务端提交数据。
2、 Content-Type
: 是指 http/https
发送信息至服务器时的内容编码类型, Content-Type
用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据。四种常见的 POST
请求的 Content-Type
数据类型:
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
3、 Express.js
: Express
是一个保持最小规模的灵活的 Node.js Web
应用程序开发框架,为 Web
和移动应用程序提供一组强大的功能。
本文我们主要介绍 Post
请求的 4 种 Content-Type
数据类型,以及如何使用 Express
来对每种 Content-Type
类型进行解析。已经将完整的代码实例上传到 github,github
地址为: https://github.com/fengshi123/request_example,欢迎 star 。
二、四种POST请求的Content-Type数据类型解析
1、application/x-www-form-unlencoded
最常见的 POST
提交数据的方式,浏览器的原生 form
表单,如果不设置 enctype
属性,那么最终就会默认以 application/x-www-form-urlencoded
方式提交数据。
1.1、前端请求代码
var reqParam = "name=jack";
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send(reqParam);
1.2、服务端解析代码
app.post('/urlencoded', bodyParser.urlencoded({extend:true}), function (req, res) {
var result = {
name: req.body.name,
sex: '男',
age: 15
};
res.send(result);
});
1.3、浏览器请求 / 响应截图
请求:
响应:
2、multipart/form-data
使用表单上传文件时,必须指定表单的 enctype
属性值为 multipart/form-data
. 请求体被分割成多部分,每部分使用 --boundary
分割开始,紧接着内容描述信息,最后是字段具体内容(文本或二进制);如果传输的是文件,还要包含文件名和文件类型信息;
2.1、前端请求代码
var reqParam = new FormData(document.form2);
xhr.send(reqParam);
2.2、服务端解析代码
express
提供了两种插件 formidable
和 multiparty
来处理数据类型为 multipart/form-data
的情况,以下我们分别用两个插件进行处理;
2.2.1、formidable 插件
(1)安装插件
npm install formidable --save
(2)服务端解析处理
app.post('/formData1', function (req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = "upload/";
form.parse(req, function (err, fields, files) {
var obj = {};
Object.keys(fields).forEach(function (name) {
obj[name] = fields[name];
});
Object.keys(files).forEach(function (name) {
if (files[name] && files[name].name) {
obj[name] = files[name];
fs.renameSync(files[name].path, form.uploadDir + files[name].name);
}
});
res.send(obj);
});
});
2.2.2、multiparty 插件
(1)安装插件
npm install multiparty--save
(2)服务端解析处理
app.post('/formData2', function (req, res) {
// 解析一个文件上传
var form = new multiparty.Form();
//设置编辑
form.encoding = 'utf-8';
//设置文件存储路径
form.uploadDir = "upload/";
//设置单文件大小限制
form.maxFilesSize = 2000 * 1024 * 1024;
form.parse(req, function (err, fields, files) {
var obj = {};
Object.keys(fields).forEach(function (name) {
obj[name] = fields[name];
});
Object.keys(files).forEach(function (name) {
if (files[name] && files[name][0] && files[name][0].originalFilename) {
obj[name] = files[name];
fs.renameSync(files[name][0].path, form.uploadDir + files[name][0].originalFilename);
}
});
res.send(obj);
});
});
2.3、浏览器请求 / 响应截图
请求:
响应:
3、application/json
application/json
这个 Content-Type
作为响应头,用来告诉服务端消息主体是序列化后的 JSON
字符串。由于 JSON
规范的流行,除了低版本 IE
之外的各大浏览器都原生支持 JSON.stringify
,服务端语言也都有处理 JSON
的函数,使用 JSON
不会遇上什么麻烦。
3.1、前端请求代码
var reqParam = {
name: 'jack'
};
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify(reqParam));
3.2、服务端解析代码
app.post('/applicationJson', bodyParser.json(), function (req, res) {
var result = {
name: req.body.name,
sex: '男',
age: 15
};
res.send(result);
});
3.3、浏览器请求 / 响应截图
请求:
响应:
4、text/xml
它是一种使用 HTTP
作为传输协议, XML
作为编码方式的远程调用规范,它的使用也很广泛,能很好的支持已有的 XML-RPC
服务。不过, XML
结构还是过于臃肿,一般场景用 JSON
会更灵活方便。
4.1、前端请求代码
var text = '<?xml version="1.0"?><methodCall><methodName>examples.getStateName</methodName>' + '<params><param><value><i4>41</i4></value></param></params></methodCall>';
xhr.setRequestHeader('Content-type', 'text/xml');
xhr.send(text);
4.2、服务端解析代码
app.post('/textXml', bodyParser.urlencoded({extend:true}), function (req, res) {
var result = '';
req.on('data', function (chunk) {
result += chunk;
});
req.on('end', function () {
res.send(result);
});
});
4.3、浏览器请求 / 响应截图
请求:
响应:
三、踩坑汇总
1、对于跨域请求,当 contentType
改为 application/json
,将触发浏览器发送一个预检 OPTIONS
请求到服务器,再发送正常的 post
请求;
2、使用 new FormData()
,然后设置 Content-type
为 application/x-www-form-urlencoded
或者 multipart/form-data
会导致后端无法正常解析,解决方法:就是不进行头部设置, Content-type
会默认 为 multipart/form-data
,服务端正常解析;
3、 contentType
设置为 application/x-www-form-urlencoded
时,传给后端的请求参数为 JSON
字符串, chrome
调试框查看发送的请求参数多了冒号,如下所示:
这是因为 application/x-www-form-urlencoded
它将被解析成键值对展示,但是字符串进去是没有改变的,但是展示的时候能看见。解决方法:如果为 JSON
字符串,则设置数据类型为 application/json
;
四、总结
本文我们主要介绍 Post
请求的 4 种 Content-Type
数据类型,以及如何使用 Express
来对每种 Content-Type
类型进行解析。已经将完整的代码实例上传到 github
, github
地址为:https://github.com/fengshi123/request_example,欢迎 star 。 demo
截图如下所示:
来源:https://juejin.im/post/5cee6e146fb9a07ea712f37f


猜你喜欢
- 今天我们说一下使用python将word内容转换成html文件。下面一起来看一下。准备工作使用python类库PyDocX,安装方法(使用p
- df.dropna()函数用于删除dataframe数据中的缺失数据,即 删除NaN数据.官方函数说明:DataFrame.dropna(a
- Python 包含6种数据类型,其中Number(数字)、String(字符串)、Tuple(元组)、List(列表)、Dictionary
- 前言:通常我们创建类都是使用class 类名,但是小伙伴们有没有想过,类是由谁来创建的呢,python中常说的万物皆对象,对象是由类创建的,
- 变量输入就是用代码获取用户通过键盘输入的信息。python中可以使用input()函数实现输入变量, input() 函数接受一个标准输入数
- 生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现。部分常用的加密方法基本都有对应的Python库,基本不再需要
- 在进行接口自动化测试时,有好多接口都基于登陆接口的响应值来关联进行操作的,在次之前试了很多方法,都没有成功,其实很简单用session来做。
- 微信跳一跳自动代码,具体内容如下那个跳一跳python“ * ”,有几个python文件,其中有一个是得到截图,然后鼠标在图片上点击两次,py
- python中数据处理是比较方便的,经常用的就是读写文件,提取数据等,本博客主要介绍其中的一些用法。Pandas是一个强大的分析结构化数据的
- 先给大家介绍下Python读取文件夹按数字排序的代码,内容如下所示:python中 os.listdir()方法用于返回指定的文件夹包含的文
- 相同点都属于序列类型的数据所谓序列类型的数据,就是说它的每一个元素都可以通过指定一个编号,行话叫做“偏移量”的方式得到,而要想一次得到多个元
- 我最近用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常
- 咱们用的os模块,读取文件的时候,其实他是含有__enter__ __exit__ 。 一个是with触发的时候,一个是退出的时
- 虽然每天发送高(hao)精(nan)专(dong)的资讯文章给大家,大家还是很给面子的都来阅读了,所以能看的出大家都是很爱学习的人喔,所以小
- 程序开发一定要有开发工具,网上找了很多关于Python的开发工具,大神们在用记事本和VIM,小白都用PyCharm,我是属于小白一类的当然也
- PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySide免费的开发商业软件。 PySide有15个模块。这些模块
- 在使用opencv显示图像时,有时候需要显示多张图像,就会出现多个窗口,显得冗余,用户不好操作。这时候就想着能不能将这些图像在一个窗口中显示
- 前言摘要这篇文章将介绍 GoFrame 通用类型变量gvar的概念,对比 interface{}的特点;以及如何设置gvar的并发安全开关等
- 文章是从stackoverflow翻译过来的,原文地址:Relative imports for the billionth time本文要
- 本文实例分析了php文件操作的方法。分享给大家供大家参考,具体如下:一、删除文件unlink()语法: int unlink(string