http协议里定义的四种常见数据的post方法
原文 https://blog.csdn.net/charlene0824/article/details/51199292
关于http协议里定义的四种常见数据的post方法,分别是:
application/www-form-ulrencoded
multipart/form-data
application/json
text/xml
Express依赖bodyParser对请求的包体进行解析。默认支持application/json,application/www-form-urlencoded,multipart/form-data.单数对xml没有支持。需要自己代码来实现
www-form-urlencoded
http默认的post请求是这种方式,比如写一个<form>...<input type="submit/></form>.form表单里面的submit按钮默认就是这种www-form-urlencoded方式提交的
node.js下使用Express接收这种提交方式需要使用body-parse插件支持,Express和body-parser的依赖关系在4.0以下版本和4.0以上版本是不同的
var express=require("express);
var bodyParser=require('body-parser');
var app=express();
var server=require('http').createServer(app);
app.use(bodyParser.urlencoded({extended:true}));
var PORT=process.env.PORT||3008;
server.listen(PORT);
1
2
3
4
5
6
7
8
9
10
该代码搭建起了一个简单的server,在git bash中输入
$node app
1
运行起来,就可以接收post的www-form-urlencoded类型的参数
我们在上面的代码中加上一个路由(该路由需要放在监听端口的前面)
app.post('/urlencode',function(req,res){
console.log(req.body);
res.send("success");
});
1
2
3
4
在html中编写form表单,使用post方法发送请求
<form action='/urlencode' method='post'>
<input type='text' name='user' value='charlene'/>
<input type='submit'>
</form>
1
2
3
4
当提交表单时,路由中的req.body取得请求信息,并通过res.send方法将响应信息发送给客户端
form-data
该数据类型也是常见的提交数据的方式,和上面不同的是form表单里需要有enctype标识。即我们在上传文件时,需要爱form标签中做这样的标识:
<form enctype="multipart/form-data"></form>
如果是通过ajax方法提交表单,可以XHR2的FormData方法提交处理上传文件的表单。例如表单中含有上传的文件和其他需要提交的字段
`<form method="post" id="form-article">
<label>文章标题:</label>
<input type="text" name="title" placeholder="请输入标题" class="text-input"></input>
<label>文章封面:</label><input type="file" name="postImg" value="上传图片" id="upload">
<input type="submit" >
</form>`
1
2
3
4
5
6
以上的form表单中,含有需要提交的文章标题字段和文章封面的图像上传。当使用ajax实现表单提交时,需要使用xhr2中的FormData类型。
在下面的代码中,result为将表单提交的字段序列化的结果,为一个key=value形式的字符串。
var upload=document.getElementById("upload");
var formD=new FormData();
for(var i = 0; i < result.length; i++){
var val = result[i].split("=");
formD.append(val[0],val[1]);
}
//如果上传上传的图片不为空,取出上传的图片内容
if(upload.files[0]){
formD.append("file",upload.files[0]);
}
ajax("post","/upload1",null,formD,function(res){
console.log(res);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
ajax为自己封装的ajax发送请求的方法,想了解此方法 见附录
使用nodejs处理form-data数据,需要引入中间件multer或connect-multiparty,这里我使用multer中间件 关于multer中间件的安装及相关方法及属性,请参见我的上一篇博客
在路由文下,编写form表单请求路由时处理的功能
var upload=require('multerUtil');
app.post('/upload1',upload.single("file"),function(req,res){
console.log(req.body);//req.body中存放一般字段中存在的字段值
//将信息存入文章数据库
console.log(req.file);//req.file中存放上传的文件信息
var post = new Post("cheng", req.body.title, req.body.tags,req.body.post,req.body.cates,req.file.path);
post.save(function (err) {
console.log(post);
if (err) {
console.log("error");
}
res.send({
user: "cheng",
title: req.body.title,
tags: req.body.tags,
post: req.body.post,
cates: req.body.cates
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
});
*注:multerUtil为引入multer中间件,并设置中间件的storage后返回的中间件,设置方法请参照我的上一篇博客
application/json
bodyParser支持此类参数的解析。不过如果需要发送json数据,需要对发送请求的请求头设置,如果是ajax上传,设置请求头方法如下
xhr.setRequestHeader=("Content-Type":"application/json");
1
同时,请求信息的格式需要是json字符串格式,如果是json格式,需要通过JSON.stringify()方法将json格式的数据转化为json字符串格式的数据进行传输,后台node.js 在相应的路由下通过req.body接收请求的信息。
text/xml
这种请求类型不是特别常见,body-parse默认也不解析这种数据格式,目前腾讯、微信在使用这种数据交换格式,node.js中只能自己编写代码处理,把请求体参数按照字符串读取出来,然后使用xml2json包吧字符串解析成json对象。
首先还是使用body-parse得到字符串,然后再转化
xml格式请求需要指定http请求头content-type=text/xml
利用req上定义的事件data来获取http请求流,end事件结束请求流的处理
利用xml2json把上面得到的请求参数流转化为json对象
首先需要安装xml2json
$npm install xml2json
var xml2json=require('xml2json');
app.post('/xml',function(req,res){
req.rawBody='';
var json={};
req.setEncoding('utf8');
req.on('data',function(req,res){
req.rawBody+=chunk;
});
req.on('end',funciton(){
json=xml2json.toJson(req.rawBody);
res.send(JSON.stringify(json));
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
参考文献:node.js下依赖Express实现post 4中方式提交参数
附录:ajax封装的方法
//创建xhr对象
function createXHR(){
if(typeof XMLHttpRequest!="undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject!="undefined"){
if(typeof arguments.callee.activeXString!="string"){
var versions=[
"MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"
],
i,len;
for ( i = 0,len=versions.length; i < len; i++) {
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break;
}catch(ex){
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error("no XHR Object available");
}
}
/**
* ajax请求的方法
* @param {string} met 发送请求的类型 值为'post'或‘get’等ajax能接受的请求类型
* @param {string} url 请求的url
* @param {string/json/formdata} mes 发送请求时的请求信息
* @param {Function} callback 请求成功之后需要调用的回调函数
* @return 处理请求后的结果
*/
var ajax=function(met,url,mes,callback){
var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState==1){
console.log("writing");
}
if (xhr.readyState==4) {
if (xhr.status>=200&&xhr.status<300||xhr.status==304) {
callback(xhr.responseText);
}else{
console.log("request was unsuccessful:"+xhr.status);
}
}
}
xhr.open(met,url,true);
xhr.send(mes);
}
http协议里定义的四种常见数据的post方法的更多相关文章
- Java中有四种常见的Map实现方法
在 HTML5 之前我们做图片预览主流做法有两种,第一种是通过 Flash 插件来做预览,第二种是 Ajax 实现的假预览,也就是说选择图片文件后,图片其实已经异步上传到服务器,服务器处理后返回图片路 ...
- (转)四种常见的 POST 提交数据方式
四种常见的 POST 提交数据方式(转自:https://imququ.com/post/four-ways-to-post-data-in-http.html) HTTP/1.1 协议规定的 HTT ...
- 四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)
四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml) 转 ...
- application/json 四种常见的 POST 提交数据方式
四种常见的 POST 提交数据方式 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 ...
- 转:application/json 四种常见的 POST 提交数据方式
四种常见的 POST 提交数据方式 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 PO ...
- robot framework接口测试之二-四种常见的POST提交数据方式
写接口测试用例时,遇到以json格式提交数据时,报错,Request如下图: Response如下图: 改成form格式提交,可以正常运行,如下图: 代码如下: ------------------- ...
- 四种常见的POST提交数据方式
POST一般用来向服务端提交数据,有四种提交数据的格式,分别是: 1.application/x-www-form-urlencoded 2.application/json 3.multipart/ ...
- POST提交数据时四种常见的数据格式
最近项目部署到新环境tomcat+mysql,想看看项目部署成功没有,就用soupui调对应接口开测试,soupui使用比较简单,给上接口地址,入参xml报文,把入参的media Type设置为app ...
- 四种常见的App弹窗设计,你有仔细注意观察吗?
弹窗又称为对话框,是App与用户进行交互的常见方式之一.弹窗分为模态弹窗和非模态弹窗两种,两者的区别在于需不需要用户对其进行回应.模态弹窗会打断用户的正常操作,要求用户必须对其进行回应,否则不能继续其 ...
随机推荐
- luoguP4770 [NOI2018]你的名字
题意 不妨先考虑\(l=1,r=|S|\)的情况: 这时我们要求的其实是\(S,T\)的本质不同的公共子串数量. 首先对\(S\)建一个后缀自动机,同时对于每个\(T\),我们也建一个自动机. 根据后 ...
- K-消亡的质数-(简单数学)
https://ac.nowcoder.com/acm/contest/3346/K 题意:判断一个素数p是不是某两个数的立方差. 刚看到这道题一时半会都没有什么思路,看了题解恍然大悟,太久没碰数学或 ...
- 前端/h5/React D3.js实现根据数据动态更新图形/类似进度实时变化效果
最近接到一个需求,在满足规则下,实现类似这种展示效果,其实就是用图形反映数据(NK,一种干扰值) 运行后,它其实是不断在动的,每格都可能显示灰色或者彩色 这里一共是10个格子,每格代表一个范围边界,说 ...
- Nginx 安装与部署配置
下载 官方网站:https://nginx.org/en/download.html Windows下安装 安装 下载后解压(切记不能含有中文路径!!),文件结构如图(我解压的路径就有中文,记得拷贝放 ...
- Docker入门之安装与使用
1. 安装(windows) win7.win8以及win10家庭版 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliy ...
- Identity Server4资料
https://www.cnblogs.com/cgzl/p/9405796.html https://www.cnblogs.com/cgzl/p/7780559.html https://clou ...
- Shell基本运算符之布尔运算符、逻辑运算符
Shell基本运算符 =============================摘自与菜鸟教程=============================== 1.布尔运算符 ! 非运算,表达式为tru ...
- windows10 启动安卓模拟器会蓝屏的解决方案
最近突然想用win10装个安卓模拟器玩游戏,然后提示vt被占用. 查了一下,了解到在windows 10 系统上,我们会用vmware,virtual box ,hyper-v,安卓模拟器,360安全 ...
- vue中引入mintui、vux重构简单的APP项目
最近在学习vue时也了解到一些常用的UI组件,有用于PC的和用于移动端的.用于PC的有:Element(饿了么).iView等:用于移动端APP的有Vux.Mint UI(饿了么).Vant(有赞团队 ...
- 2019-11-29-WPF-模拟触摸设备
原文:2019-11-29-WPF-模拟触摸设备 title author date CreateTime categories WPF 模拟触摸设备 lindexi 2019-11-29 08:47 ...