咱們知道,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
http默認的post請求是這種方式,注意這是是默認的提交方式,好比你寫一個git
<form>....<input type="submit" /></form>複製代碼
form表單,裏面的submit按鈕默認就是這種 www-form-urlencoded 方式提交的。
咱們採用body-parser這個插件就能夠了,具體用法請點連接。github
表單提交默認是www-form-urlencoded,可是當須要上傳文件的時候,必須在form標籤裏作這樣的標識 enctype="multipart/form-data"。
Node中處理這類表單還須要如下其中一種中間件express
須要特別注意的是,form-data這三個插件自己就能夠處理www-form-urlencoded,因此若是須要同時處理字段和文件,不須要再引入www-form-urlencoded相關的插件了。npm
bodyParser 支持此類參數解析.json
注意: 在提交以前須要指定http請求頭設爲 content-type=application/json bash
這種請求類型不是特別常見,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 .推薦採用後者。