nodejs下基於express實現post4種方式提交參數


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

 

 


 

 

 

上面這個圖好有意思啊,哈哈, v8威武啊....

在2014年的最后一天和大家分享關於node.js 如何提交4種格式的post數據.

上上一篇說到了關於http協議里定義的4種常見數據的post方法 ,詳細介紹請點擊查看.

分別是這四種:

www-form-urlencoded,

form-data,

application/json,

text/xml

 

Express 依賴 bodyParser 對請求的包體進行解析,默認支持:application/json, application/x-www-form-urlencoded, multipart/form-data.可惜對xml沒有支持,需要自己代碼來實現,下面我們一一簡單介紹.

 

(一) www-form-urlencoded

http默認的post請求是這種方式,注意這是是默認的提交方式,比如你寫一個<form>....<input type="submite" /></form> form表單,里面的submite按鈕默認就是這種 www-form-urlencoded 方式提交的.

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM