Express 提交数据的几种方式

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

<method> <request-url> <version>

<headers>

<entity-body></entity-body></headers></version></request-url></method>复制代码

协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并无规定数据必须使用什么编码方式。实际上,开发者彻底能够本身决定消息主体的格式,只要最后发送的 HTTP 请求知足上面的格式就能够。html

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

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

一.www-form-urlencoded

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

<form>....<input type="submit" /></form>复制代码

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

二. form-data

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

须要特别注意的是,form-data这三个插件自己就能够处理www-form-urlencoded,因此若是须要同时处理字段和文件,不须要再引入www-form-urlencoded相关的插件了。npm

三.application/json

bodyParser 支持此类参数解析.json

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

四.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 .推荐采用后者。