在2014年的最後一天和你們分享關於node.js 如何提交4種格式的post數據.html
上上一篇說到了關於http協議裏定義的4種常見數據的post方法 ,詳細介紹請點擊查看.node
分別是這四種:git
www-form-urlencoded,github
form-data,express
application/json,npm
text/xmljson
Express 依賴 bodyParser 對請求的包體進行解析,默認支持:application/json, application/x-www-form-urlencoded, multipart/form-data.惋惜對xml沒有支持,須要本身代碼來實現,下面咱們一一簡單介紹.api
(一) www-form-urlencoded微信
http默認的post請求是這種方式,注意這是是默認的提交方式,好比你寫一個<form>....<input type="submite" /></form> form表單,裏面的submite按鈕默認就是這種 www-form-urlencoded 方式提交的.app
node.js 下使用Express 如何接收這種提交方式.須要 body-parse 插件支持,Express 和body-parse 的依賴關係在4.0如下版本和4.0以上版本是不一樣的,能夠搜索本站 body-parse 關鍵詞查看.
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); var server = require('http').createServer(app); app.use(bodyParser.urlencoded({ extended: true })); var PORT = process.env.PORT || 8002; server.listen(PORT);
上面搭建起一個簡單的server ,node app.js 運行起來,如今是能夠接收 post www-form-urlencoded類型參數的.
咱們在上面的代碼中加上一個路由.
app.post('/urlencoded', function (req, res) { console.log(req.body); res.send(req.body); }); //注意,這個路由應該是加在 var PORT=process.env.PORT || 8002; 上面
如今用postman模擬一個post請求,
紅框指定了提交方式是 www-form-urlencoded 方式
能夠看到 200 狀態,成功識別了請求參數而且返回來.
(二) form-data
也是比較經常使用的提交數據的方式,和上面一種不一樣的是form表單裏須要有 enctype 標識.
好比咱們在上傳文件的時候,必須在form標籤裏作這樣的標識 enctype="multipart/form-data"
而這種提交方式通常用在文件上傳,因此 在node.js 裏處理這類表單還須要 中間件 connect-multiparty ,他是專門處理此類post數據相關的依賴包.github官方地址: https://github.com/andrewrk/connect-multiparty
npm install connect-multiparty
使用也很是簡單,上面的代碼不變,只須要在你的相關路由裏指定此中間件,它就能夠幫你處理請求.
var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); app.post('/formdata',multipartMiddleware, function (req, res) { console.log(req.body); res.send(req.body); });
我用postman模擬,沒有辦法上傳文件,只模擬表單...參數一樣直接返回客戶端,
(三) application/json
通常api喜歡此類提交方式,數據使用方法,節省帶寬.
bodyParser 支持此類參數解析.
注意: 在提交以前須要指定http 請求頭爲 content-type=application/json
代碼以下:
var express = require('express'); var bodyParser = require('body-parser'); var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); //var morgan = require('morgan'); var app = express(); var server = require('http').createServer(app); app.use(bodyParser.json({limit: '1mb'})); //這裏指定參數使用 json 格式 app.use(bodyParser.urlencoded({ extended: true })); app.post('/json', function (req, res) { console.log(req.body); res.send(req.body); }); var PORT = process.env.PORT || 8002; server.listen(PORT);
注意上面的配置參數,指定參數使用json格式.
app.use(bodyParser.json({limit: '1mb'}));
(四) text/xml
這種請求類型不是特別常見, body-parse默認也不解析這種數據格式,目前騰訊微信平臺在使用這種數據交換格式.node.js 在express 如何解析這種格式,沒有好的辦法,只能本身用代碼處理,把請求體參數按照字符串讀取出來,而後使用 xml2json 包把字符串解析成json對象,使用起來就方便多了.
注意:
咱們仍是要使用 body-parse 獲得字符串,而後再轉化.
xml格式請求須要指定 http 請求頭 content-type=text/xml
利用req上定義的事件 data 來獲取http請求流, end 事件結束請求流的處理.
利用 xml2json 把上面獲得的請求參數流(咱們直接轉化爲字符串)轉化爲 json 對象.
npm install xml2json
代碼以下:
var express = require('express'); var bodyParser = require('body-parser'); var xml2json=require('xml2json'); var app = express(); var server = require('http').createServer(app); app.use(bodyParser.urlencoded({ extended: true })); app.post('/xml', function (req, res) { req.rawBody = ''; var 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)); }); }); var PORT = process.env.PORT || 8002; server.listen(PORT);
咱們最後也是把提交的xml格式字符串轉化成json對象輸出到客戶端.
轉自:http://yijiebuyi.com/blog/90c1381bfe0efb94cf9df932147552be.html