Express 中間件----body-parser【轉載】

body-parser是什麼?

body-parser是一個HTTP請求體解析中間件,使用這個模塊能夠解析JSON、Raw、文本、URL-encoded格式的請求體,Express框架中就是使用這個模塊作爲請求體解析中間件。html

body-parser 與 原生解析對比

Node.js 原生HTTP模塊中,是將用戶請求數據封裝到了用於請求對象req中,該對象是一個IncomingMessage,該對象同時也是一個可讀流對象。git

var http = require('http');
//用http模塊建立一個http服務端 
http.createServer(function(req, res) {
req.on('data', function(chunk){
....
});
req.on('end', function(){
....
//在此對不一樣類型進行判斷
}).listen(3000);;

複製代碼

body-parser模塊是一個Express中間件,它使用很是簡單且功能強大,接下來進入乾貨階段.github

第二部分 body-parser

2.1 下載配置express

$ npm install body-parser

複製代碼

2.2 基本使用npm

var express = require('express')
//獲取模塊
var bodyParser = require('body-parser')

var app = express()

// 建立 application/json 解析
var jsonParser = bodyParser.json()

// 建立 application/x-www-form-urlencoded 解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /login 獲取 URL編碼的請求體
app.post('/login', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})

// POST /api/users 獲取 JSON 編碼的請求體
app.post('/api/users', jsonParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  // create user in req.body
});
app.listen(3000);

複製代碼

2.3 APIjson

對請求體的四種解析方式:api

1\. bodyParser.json(options): 解析json數據
2\. bodyParser.raw(options): 解析二進制格式(Buffer流數據)
3\. bodyParser.text(options): 解析文本數據
4\. bodyParser.urlencoded(options): 解析UTF-8的編碼的數據。

複製代碼

2.3.1 bodyParser 解析json數據bash

var bodyParser = require('body-parser')

複製代碼

bodyParser變量是對中間件的引用。請求體解析後,解析值都會被放到req.body屬性,內容爲空時是一個{}空對象。服務器

2.3.2 bodyParser.json(options) :返回一個僅解析json格式數據的中間件。app

option可選對象:

1. inflate - 設置爲true時,deflate壓縮數據會被解壓縮;設置爲true時,deflate壓縮數據會被拒絕。默認爲true。
2. limit - 設置請求的最大數據量。默認爲'100kb'
3. reviver - 傳遞給JSON.parse()方法的第二個參數,詳見JSON.parse()
4. strict - 設置爲true時,僅會解析Array和Object兩種格式;設置爲false會解析全部JSON.parse支持的格式。默認爲true
5. type - 該選項用於設置爲指定MIME類型的數據使用當前解析中間件。這個選項能夠是一個函數或是字符串,當是字符串是會使用type-is來查找MIMI類型;當爲函數是,中間件會經過fn(req)來獲取實際值。默認爲application/json。
6. verify - 這個選項僅在verify(req, res, buf, encoding)時受支持

複製代碼

2.3.3 bodyParser.raw(options)

返回一個將全部數據作爲Buffer格式處理的中間件.其後的全部的req.body中將會是一個Buffer值。

option可選值:

1\. inflate - 設置爲true時,deflate壓縮數據會被解壓縮;設置爲true時,deflate壓縮數據會被拒絕。默認爲true。
2\. limit - 設置請求的最大數據量。默認爲'100kb'
3\. type - 該選項用於設置爲指定MIME類型的數據使用當前解析中間件。這個選項能夠是一個函數或是字符串,當是字符串是會使用type-is來查找MIMI類型;當爲函數是,中間件會經過fn(req)來獲取實際值。默認爲application/octet-stream。
4\. verify - 這個選項僅在verify(req, res, buf, encoding)時受支持

複製代碼

2.3.4 bodyParser.text(options) 解析文本格式

返回一個僅處理字符串格式處理的中間件。其後的全部的req.body中將會是一個字符串值。

1\. defaultCharset - 若是Content-Type後沒有指定編碼時,使用此編碼。默認爲'utf-8'
2\. inflate - 設置爲true時,deflate壓縮數據會被解壓縮;設置爲true時,deflate壓縮數據會被拒絕。默認爲true。
3\. limit - 設置請求的最大數據量。默認爲'100kb'
4\. type - 該選項用於設置爲指定MIME類型的數據使用當前解析中間件。這個選項能夠是一個函數或是字符串,當是字符串是會使用type-is來查找MIMI類型;當爲函數是,中間件會經過fn(req)來獲取實際值。默認爲application/octet-stream。
5\. verify - 這個選項僅在verify(req, res, buf, encoding)時受支持

複製代碼

2.3. 5 bodyParser.urlencoded(options) 解析UTF-8的編碼的數據。 返回一個處理urlencoded數據的中間件。

option可選值

1\. extended - 當設置爲false時,會使用querystring庫解析URL編碼的數據;當設置爲true時,會使用qs庫解析URL編碼的數據。後沒有指定編碼時,使用此編碼。默認爲true
2\. inflate - 設置爲true時,deflate壓縮數據會被解壓縮;設置爲true時,deflate壓縮數據會被拒絕。默認爲true。
3\. limit - 設置請求的最大數據量。默認爲'100kb'
4\. parameterLimit - 用於設置URL編碼值的最大數據。默認爲1000
5\. type - 該選項用於設置爲指定MIME類型的數據使用當前解析中間件。這個選項能夠是一個函數或是字符串,當是字符串是會使用type-is來查找MIMI類型;當爲函數是,中間件會經過fn(req)來獲取實際值。默認爲application/octet-stream。
6\. verify - 這個選項僅在verify(req, res, buf, encoding)時受支持

複製代碼

代碼示例:

var express = require('express')
var bodyParser = require('body-parser')
var app = express()

// create application/json parser
var jsonParser = bodyParser.json()
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /home 獲取 urlencoded bodies
app.post('/home', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})

// POST /api/users 獲取 JSON bodies
app.post('/about', jsonParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  res.send('welcome ****, ' + req.body.username)
});

app.listen(3000);

複製代碼

image

image

第三部分 POST相關內容

HTTP 協議是以 ASCII 碼傳輸,創建在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分爲三個部分:狀態行請求頭消息主體。HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。

協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並無規定數據必須使用什麼編碼方式。 POST 提交數據時,包含了 Content-Type消息主體編碼方式兩部分。由於服務器端一般會依據Content-Type來決定使用何種方式解析主體部分.

四種方式:

1. application/x-www-form-urlencoded:提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。
2. multipart/form-data:使用表單上傳文件時,必須讓 <form> 表單的 enctype 等於 multipart/form-data
3. application/json: 用來告訴服務端消息主體是序列化後的 JSON 字符串。
4. text/xml: 它是一種使用 HTTP 做爲傳輸協議,XML 做爲編碼方式的遠程調用規範。
複製代碼

其中application/x-www-form-urlencoded編碼實際上是基於uri的percent-encoding編碼的,因此採用application/x-www-form-urlencoded的POST數據和queryString只是形式不一樣,本質都是傳遞參數。

參考 github====body-parser 關於application/x-www-form-urlencoded編碼 四種常見的 POST 提交數據方式 stackoverflow

相關文章
相關標籤/搜索