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 .推薦採用後者。

相關文章
相關標籤/搜索