Express 提交数据的几种方式

2,327 阅读3分钟

我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP协议之上的应用层规范。该规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:

<method> <request-url> <version>

<headers>

<entity-body></entity-body></headers></version></request-url></method>

协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

但是,数据发送出去,还要服务端解析成功才有意义。一般服务端如 Node.js、php、python、java 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。
关于POST 提交数据方式,详细的内容就不介绍了,请参考
四种常见的 POST 提交数据方式

好了,进入正片 >>>
对于Node的Express框架来说,主要需要处理一下四种格式:

一.www-form-urlencoded

http默认的post请求是这种方式,注意这是是默认的提交方式,比如你写一个

<form>....<input type="submit" /></form>

form表单,里面的submit按钮默认就是这种 www-form-urlencoded 方式提交的。
我们采用body-parser这个插件就可以了,具体用法请点链接。

二. form-data

表单提交默认是www-form-urlencoded,但是当需要上传文件的时候,必须在form标签里做这样的标识 enctype="multipart/form-data"
Node中处理这类表单还需要以下其中一种中间件

需要特别注意的是,form-data这三个插件本身就可以处理www-form-urlencoded,所以如果需要同时处理字段和文件,不需要再引入www-form-urlencoded相关的插件了。

三.application/json

bodyParser 支持此类参数解析.

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

四.text/xml

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

const express = require('express'),
    bodyParser = require('body-parser'),
    xml2json=require('xml2json'),
    app = express(),
    server = require('http').createServer(app);

app.use(bodyParser.urlencoded({
  extended: true
}));

app.post('/xml', function (req, res) {
  req.rawBody = '';
  let 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));
  });

});

const PORT = process.env.PORT || 8002;
server.listen(PORT);

第二种方式就是使用针对微信的中间件,wechat-parser .
推荐采用后者。