node.js 下依賴Express 實現post 4種方式提交參數

在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

相關文章
相關標籤/搜索