Express 提交資料的幾種方式

tcfellow發表於2019-02-27

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

相關文章