欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Express.js解析Post數(shù)據類型的正確姿勢

 更新時間:2019年05月30日 09:43:09   作者:我是你的超級英雄  
這篇文章主要介紹了Express.js解析Post數(shù)據類型的正確姿勢,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、概念介紹

1、POST請求:HTTP/1.1 協(xié)議規(guī)定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來向服務端提交數(shù)據。

2、 Content-Type是指 http/https 發(fā)送信息至服務器時的內容編碼類型, Content-Type 用于表明發(fā)送數(shù)據流的類型,服務器根據編碼類型使用特定的解析方式,獲取數(shù)據流中的數(shù)據。四種常見的 POST 請求的 Content-Type 數(shù)據類型:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • text/xml

3、 Express.jsExpress 是一個保持最小規(guī)模的靈活的 Node.js Web 應用程序開發(fā)框架,為 Web 和移動應用程序提供一組強大的功能。

本文我們主要介紹 Post 請求的 4 種 Content-Type 數(shù)據類型,以及如何使用 Express 來對每種 Content-Type 類型進行解析。已經將完整的代碼實例上傳到 github,github 地址為: https://github.com/fengshi123/request_example,歡迎 star 。

二、四種POST請求的Content-Type數(shù)據類型解析

1、application/x-www-form-unlencoded

最常見的 POST 提交數(shù)據的方式,瀏覽器的原生 form 表單,如果不設置 enctype 屬性,那么最終就會默認以 application/x-www-form-urlencoded 方式提交數(shù)據。

1.1、前端請求代碼

var reqParam = "name=jack";
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send(reqParam);

1.2、服務端解析代碼

app.post('/urlencoded', bodyParser.urlencoded({extend:true}), function (req, res) {  
 var result = {
   name: req.body.name,    
   sex: '男',    
   age: 15  
 };  
 res.send(result);
});

1.3、瀏覽器請求 / 響應截圖

請求:

響應:

2、multipart/form-data

使用表單上傳文件時,必須指定表單的 enctype 屬性值為 multipart/form-data . 請求體被分割成多部分,每部分使用 --boundary 分割開始,緊接著內容描述信息,最后是字段具體內容(文本或二進制);如果傳輸?shù)氖俏募?,還要包含文件名和文件類型信息;

2.1、前端請求代碼

var reqParam = new FormData(document.form2);
xhr.send(reqParam);

2.2、服務端解析代碼

express 提供了兩種插件 formidablemultiparty 來處理數(shù)據類型為 multipart/form-data 的情況,以下我們分別用兩個插件進行處理;

2.2.1、formidable 插件

(1)安裝插件

npm install formidable --save

(2)服務端解析處理

app.post('/formData1', function (req, res) {  
  var form = new formidable.IncomingForm();  
  form.uploadDir = "upload/";  
  form.parse(req, function (err, fields, files) {    
   var obj = {};    
   Object.keys(fields).forEach(function (name) { 
     obj[name] = fields[name];    
   });    
   Object.keys(files).forEach(function (name) {      
     if (files[name] && files[name].name) {        
       obj[name] = files[name];        
       fs.renameSync(files[name].path, form.uploadDir + files[name].name);     
    }    
   });   
   res.send(obj);  
  });
});

2.2.2、multiparty 插件

(1)安裝插件

npm install multiparty--save

(2)服務端解析處理

app.post('/formData2', function (req, res) {  
 // 解析一個文件上傳  
var form = new multiparty.Form();  
//設置編輯  
form.encoding = 'utf-8';  
//設置文件存儲路徑  
form.uploadDir = "upload/";  
 //設置單文件大小限制  
form.maxFilesSize = 2000 * 1024 * 1024;  
form.parse(req, function (err, fields, files) {    
   var obj = {};    
   Object.keys(fields).forEach(function (name) {      
     obj[name] = fields[name];    
   });    
   Object.keys(files).forEach(function (name) {      
     if (files[name] && files[name][0] && files[name][0].originalFilename) {        
       obj[name] = files[name];        
       fs.renameSync(files[name][0].path, form.uploadDir + files[name][0].originalFilename); 
     }    
   });    
   res.send(obj);  
  });
});

2.3、瀏覽器請求 / 響應截圖

請求:

響應:

3、application/json

application/json 這個 Content-Type 作為響應頭,用來告訴服務端消息主體是序列化后的 JSON 字符串。由于 JSON 規(guī)范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify ,服務端語言也都有處理 JSON 的函數(shù),使用 JSON 不會遇上什么麻煩。

3.1、前端請求代碼

var reqParam = {  
   name: 'jack'
};
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify(reqParam));

3.2、服務端解析代碼

app.post('/applicationJson', bodyParser.json(), function (req, res) {  
var result = {    
  name: req.body.name,    
  sex: '男',    
  age: 15  
 };  
  res.send(result);
});

3.3、瀏覽器請求 / 響應截圖

請求:

響應:

4、text/xml

它是一種使用 HTTP 作為傳輸協(xié)議, XML 作為編碼方式的遠程調用規(guī)范,它的使用也很廣泛,能很好的支持已有的 XML-RPC 服務。不過, XML 結構還是過于臃腫,一般場景用 JSON 會更靈活方便。

4.1、前端請求代碼

var text = '<?xml version="1.0"?><methodCall><methodName>examples.getStateName</methodName>' +  '<params><param><value><i4>41</i4></value></param></params></methodCall>';
xhr.setRequestHeader('Content-type', 'text/xml');
xhr.send(text);

4.2、服務端解析代碼

app.post('/textXml', bodyParser.urlencoded({extend:true}), function (req, res) {  
  var result = ''; 
  req.on('data', function (chunk) {    
  result += chunk;  
  });  
  req.on('end', function () {    
  res.send(result);  
  });
});

4.3、瀏覽器請求 / 響應截圖

請求:

響應:

三、踩坑匯總

1、對于跨域請求,當 contentType 改為 application/json ,將觸發(fā)瀏覽器發(fā)送一個預檢 OPTIONS 請求到服務器,再發(fā)送正常的 post 請求;

2、使用 new FormData() ,然后設置 Content-typeapplication/x-www-form-urlencoded 或者 multipart/form-data 會導致后端無法正常解析,解決方法:就是不進行頭部設置, Content-type 會默認 為 multipart/form-data ,服務端正常解析;

3、 contentType 設置為 application/x-www-form-urlencoded 時,傳給后端的請求參數(shù)為 JSON 字符串, chrome 調試框查看發(fā)送的請求參數(shù)多了冒號,如下所示:

這是因為 application/x-www-form-urlencoded 它將被解析成鍵值對展示,但是字符串進去是沒有改變的,但是展示的時候能看見。解決方法:如果為 JSON 字符串,則設置數(shù)據類型為 application/json

四、總結

本文我們主要介紹 Post 請求的 4 種 Content-Type 數(shù)據類型,以及如何使用 Express 來對每種 Content-Type 類型進行解析。已經將完整的代碼實例上傳到 github , github 地址為:https://github.com/fengshi123/request_example,歡迎 star demo 截圖如下所示:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • node?NPM庫增強版globby?Promise使用學習

    node?NPM庫增強版globby?Promise使用學習

    這篇文章主要為大家介紹了node?NPM庫增強版globby?Promise使用學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • npm、pnpm、yarn之間的區(qū)別小結

    npm、pnpm、yarn之間的區(qū)別小結

    平時在項目開發(fā)中,經常用到npm、pnpm、yarn這些來安裝包,本文主要介紹了npm、pnpm、yarn之間的區(qū)別小結,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • node實現(xiàn)基于token的身份驗證

    node實現(xiàn)基于token的身份驗證

    這篇文章主要介紹了node實現(xiàn)基于token的身份驗證,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Node.js深入分析Koa源碼

    Node.js深入分析Koa源碼

    本文主要從源碼的角度來講述 Koa,尤其是其中間件系統(tǒng)是如何實現(xiàn)的。跟 Express 相比,Koa 的源碼異常簡潔,Express 因為把路由相關的代碼嵌入到了主要邏輯中,因此讀 Express 的源碼可能長時間不得要領,而直接讀 Koa 的源碼幾乎沒有什么障礙
    2022-08-08
  • nodejs文件操作模塊FS(File System)常用函數(shù)簡明總結

    nodejs文件操作模塊FS(File System)常用函數(shù)簡明總結

    這篇文章主要介紹了nodejs文件操作模塊FS(File System)常用函數(shù)簡明總結,對FS模塊的大部份異步函數(shù)做了介紹,而且用中文注釋,這下用起來方便了,需要的朋友可以參考下
    2014-06-06
  • 使用nvm安裝node的過程及注意事項

    使用nvm安裝node的過程及注意事項

    在學習vue的過程中,最開始的就是要先安裝nodejs環(huán)境,此處記錄安裝過程及注意事項,首先需要先卸載程序中卸載先前安裝過的nvm,刪除文件管理器中安裝的文件,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Nodejs模塊的調用操作實例分析

    Nodejs模塊的調用操作實例分析

    這篇文章主要介紹了Nodejs模塊的調用操作,結合實例形式分析了nodejs模塊的定義與調用相關操作技巧,需要的朋友可以參考下
    2018-12-12
  • NodeJs安裝npm包一直失敗的解決方法

    NodeJs安裝npm包一直失敗的解決方法

    本篇文章主要介紹了NodeJs安裝npm包一直失敗的解決方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • node.js文件操作系統(tǒng)實例詳解

    node.js文件操作系統(tǒng)實例詳解

    這篇文章主要介紹了node.js文件操作,結合實例形式詳細分析了node.js針對文件的讀取、寫入、刪除、遍歷、監(jiān)控等各種常見操作技巧,需要的朋友可以參考下
    2019-11-11
  • node.js入門教程之querystring模塊的使用方法

    node.js入門教程之querystring模塊的使用方法

    querystring模塊主要用來解析查詢字符串,下面這篇文章主要介紹了關于node.js中querystring模塊使用方法的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02

最新評論