我們知道,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 .
推薦採用後者。