上面这个图好有意思啊,哈哈, v8威武啊....

在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据.

上上一篇说到了关于http协议里定义的4种常见数据的post方法 ,详细介绍请点击查看.

分别是这四种:

www-form-urlencoded,

form-data,

application/json,

text/xml

Express 依赖 bodyParser 对请求的包体进行解析,默认支持:application/json, application/x-www-form-urlencoded, multipart/form-data.可惜对xml没有支持,需要自己代码来实现,下面我们一一简单介绍.

(一) www-form-urlencoded

http默认的post请求是这种方式,注意这是是默认的提交方式,比如你写一个<form>....<input type="submite" /></form> form表单,里面的submite按钮默认就是这种 www-form-urlencoded 方式提交的.

node.js 下使用Express 如何接收这种提交方式.需要 body-parse 插件支持,Express 和body-parse 的依赖关系在4.0以下版本和4.0以上版本是不同的,可以搜索本站 body-parse 关键词查看.

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 || 8002;
server.listen(PORT);

上面搭建起一个简单的server ,node app.js 运行起来,现在是可以接收 post  www-form-urlencoded类型参数的.

我们在上面的代码中加上一个路由.

app.post('/urlencoded', function (req, res) {
  console.log(req.body);
  res.send(req.body); });
//注意,这个路由应该是加在 var PORT=process.env.PORT || 8002; 上面

现在用postman模拟一个post请求,

红框指定了提交方式是 www-form-urlencoded 方式

可以看到 200 状态,成功识别了请求参数并且返回来.

(二) form-data

也是比较常用的提交数据的方式,和上面一种不同的是form表单里需要有 enctype 标识.

比如我们在上传文件的时候,必须在form标签里做这样的标识 enctype="multipart/form-data"

而这种提交方式一般用在文件上传,所以 在node.js 里处理这类表单还需要 中间件 connect-multiparty ,他是专门处理此类post数据相关的依赖包.github官方地址: https://github.com/andrewrk/connect-multiparty

npm install connect-multiparty

使用也非常简单,上面的代码不变,只需要在你的相关路由里指定此中间件,它就可以帮你处理请求.

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart(); app.post('/formdata',multipartMiddleware, function (req, res) {
  console.log(req.body);
  res.send(req.body);
});

我用postman模拟,没有办法上传文件,只模拟表单...参数同样直接返回客户端,

(三) application/json

一般api喜欢此类提交方式,数据使用方法,节省带宽.

bodyParser 支持此类参数解析.

注意: 在提交之前需要指定http 请求头为 content-type=application/json

代码如下:

var express = require('express');
var bodyParser = require('body-parser');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart(); //var morgan = require('morgan');
var app = express();
var server = require('http').createServer(app); app.use(bodyParser.json({limit: '1mb'}));  //这里指定参数使用 json 格式
app.use(bodyParser.urlencoded({
  extended: true
})); app.post('/json', function (req, res) {
  console.log(req.body);
  res.send(req.body); }); var PORT = process.env.PORT || 8002;
server.listen(PORT);

注意上面的配置参数,指定参数使用json格式.

app.use(bodyParser.json({limit: '1mb'}));

(四) text/xml

这种请求类型不是特别常见, body-parse默认也不解析这种数据格式,目前腾讯微信平台在使用这种数据交换格式.node.js 在express 如何解析这种格式,没有好的办法,只能自己用代码处理,把请求体参数按照字符串读取出来,然后使用 xml2json 包把字符串解析成json对象,使用起来就方便多了.

注意:

我们还是要使用 body-parse 得到字符串,然后再转化.

xml格式请求需要指定 http 请求头 content-type=text/xml

利用req上定义的事件  data 来获取http请求流, end 事件结束请求流的处理.

利用 xml2json 把上面得到的请求参数流(我们直接转化为字符串)转化为 json 对象.

npm install xml2json

代码如下:

var express = require('express');
var bodyParser = require('body-parser');
var xml2json=require('xml2json'); var app = express();
var server = require('http').createServer(app); app.use(bodyParser.urlencoded({
  extended: true
})); app.post('/xml', function (req, res) {
  req.rawBody = '';
  var json={};
  req.setEncoding('utf8');   req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });
  req.on('end', function() {   json=xml2json.toJson(req.rawBody);
  
  res.send(JSON.stringify(json));
  });
  
}); var PORT = process.env.PORT || 8002;
server.listen(PORT);

我们最后也是把提交的xml格式字符串转化成json对象输出到客户端.

原文来自:http://yijiebuyi.com/blog/90c1381bfe0efb94cf9df932147552be.html

 

node.js 下依赖Express 实现post 4种方式提交参数的更多相关文章

  1. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

  2. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  3. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  4. Node.js的框架-express

    Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...

  5. node.js下操作cookie

    cookie,又是cookie.工作中与cookie打交道很多次,不过时间跨度也大,每总结多一次,就加深了解多一点. cookie,一定是放在浏览器中的,用于浏览器保存一些小额度的内容.每次我们去访问 ...

  6. Node.js 实战 & 最佳 Express 项目架构

    Node.js 实战 & 最佳 Express 项目架构 Express Koa refs https://github.com/xgqfrms/learn-node.js-by-practi ...

  7. js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言

    js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言 一.总结 一句话总结:实现按下组合键提交留言是通过给input加keydown事件,判断按键的键码来实现的. 1.如 ...

  8. js页面跳转常用的几种方式(转)

    js页面跳转常用的几种方式 转载  2010-11-25   作者:    我要评论 js实现页面跳转的几种方式,需要的朋友可以参考下. 第一种: 复制代码代码如下: <script langu ...

  9. JS与JQ绑定事件的几种方式.

    JS与JQ绑定事件的几种方式 JS绑定事件的三种方式 直接在DOM中进行绑定 <button onclick="alert('success')" type="bu ...

随机推荐

  1. JS定时器的使用--延时提示框

    <title>无标题文档</title> <style> div{float:left;margin:10px;} #div1{width:50px; height ...

  2. HDU1233--还是畅通工程(最小生成树)

    Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直 ...

  3. STM32中断触发

    使用PB1作为外部中断触发,按一次按键灯处于亮状态,在按一次灯灭. 1.先配置GPIO端口.复用管脚外设时钟使能GPIO_Config(); void GPIO_Config(void) { GPIO ...

  4. 完整的 HTML 4 + HTML 5 实体参考手册

    1 完整的 HTML 4 + HTML 5 实体参考手册 http://www.runoob.com/charsets/html-charsets.html 1 下表中的所有实体都能在所有的浏览器中正 ...

  5. plsql找外键约束关联的表的方法

    直接Ctrl + 鼠标左键 表名 就可以找到参照表(关联表)的名称 下面的是复杂的方法 这个就是关联的表 这里右键查看 可以查看到参照的表

  6. zf-关于荆州首页鼠标移动到导航栏上去触发的js 显示 问题解决办法

    是我copy代码的 时候 这个触发的属性没有修改,导致出现BUG,改成mopen('m2') 就好了

  7. Beautiful Subarrays

    Beautiful Subarrays time limit per test 3 seconds memory limit per test 512 megabytes input standard ...

  8. UIApplication,UIWindow,UIViewController,UIView(layer)

    转载自:http://www.cnblogs.com/iCocos/p/4684749.html UIApplication,UIWindow,UIViewController,UIView(laye ...

  9. Python3基础 list() 将一个字符串转换成列表

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  10. 个人学习FPGA的初步过程

    对于FPGA,完全是从零开始学习,简单讲述一下我个人学习FPGA的经历吧: 没有开发板的日子.说真的要我掏腰包买开发板觉得是一件非常奢侈的事情.理由1:现成的东西,背后影藏诸多诡异的事情我们是无法体会 ...