最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、概念介紹

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

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

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

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

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

二、四種POST請(qǐng)求的Content-Type數(shù)據(jù)類(lèi)型解析

1、application/x-www-form-unlencoded

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

1.1、前端請(qǐng)求代碼

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

1.2、服務(wù)端解析代碼

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

1.3、瀏覽器請(qǐng)求 / 響應(yīng)截圖

請(qǐng)求:

響應(yīng):

2、multipart/form-data

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

2.1、前端請(qǐng)求代碼

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

2.2、服務(wù)端解析代碼

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

2.2.1、formidable 插件

(1)安裝插件

npm install formidable --save

(2)服務(wù)端解析處理

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)服務(wù)端解析處理

app.post('/formData2', function (req, res) {  
 // 解析一個(gè)文件上傳  
var form = new multiparty.Form();  
//設(shè)置編輯  
form.encoding = 'utf-8';  
//設(shè)置文件存儲(chǔ)路徑  
form.uploadDir = "upload/";  
 //設(shè)置單文件大小限制  
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、瀏覽器請(qǐng)求 / 響應(yīng)截圖

請(qǐng)求:

響應(yīng):

3、application/json

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

3.1、前端請(qǐng)求代碼

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

3.2、服務(wù)端解析代碼

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

3.3、瀏覽器請(qǐng)求 / 響應(yīng)截圖

請(qǐng)求:

響應(yīng):

4、text/xml

它是一種使用 HTTP 作為傳輸協(xié)議, XML 作為編碼方式的遠(yuǎn)程調(diào)用規(guī)范,它的使用也很廣泛,能很好的支持已有的 XML-RPC 服務(wù)。不過(guò), XML 結(jié)構(gòu)還是過(guò)于臃腫,一般場(chǎng)景用 JSON 會(huì)更靈活方便。

4.1、前端請(qǐng)求代碼

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、服務(wù)端解析代碼

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、瀏覽器請(qǐng)求 / 響應(yīng)截圖

請(qǐng)求:

響應(yīng):

三、踩坑匯總

1、對(duì)于跨域請(qǐng)求,當(dāng) contentType 改為 application/json ,將觸發(fā)瀏覽器發(fā)送一個(gè)預(yù)檢 OPTIONS 請(qǐng)求到服務(wù)器,再發(fā)送正常的 post 請(qǐng)求;

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

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

這是因?yàn)?application/x-www-form-urlencoded 它將被解析成鍵值對(duì)展示,但是字符串進(jìn)去是沒(méi)有改變的,但是展示的時(shí)候能看見(jiàn)。解決方法:如果為 JSON 字符串,則設(shè)置數(shù)據(jù)類(lèi)型為 application/json ;

四、總結(jié)

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Nodejs之靜態(tài)資源處理

    詳解Nodejs之靜態(tài)資源處理

    這篇文章主要介紹了詳解Nodejs之靜態(tài)資源處理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • node.js文件系統(tǒng)之文件寫(xiě)入實(shí)例詳解

    node.js文件系統(tǒng)之文件寫(xiě)入實(shí)例詳解

    Node.js和其他語(yǔ)言一樣,也有文件操作,下面這篇文章主要給大家介紹了關(guān)于node.js文件系統(tǒng)之文件寫(xiě)入的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Nodejs的express使用教程

    Nodejs的express使用教程

    Express 是一個(gè)簡(jiǎn)潔、靈活的 node.js Web 應(yīng)用開(kāi)發(fā)框架, 它提供一系列強(qiáng)大的特性,幫助你創(chuàng)建各種 Web 和移動(dòng)設(shè)備應(yīng)用,本篇文章給大家介紹nodejs的express使用教程,感興趣的朋友參考下
    2015-11-11
  • node.js 微信開(kāi)發(fā)之定時(shí)獲取access_token

    node.js 微信開(kāi)發(fā)之定時(shí)獲取access_token

    本文給大家分享的是在使用node.js做微信開(kāi)發(fā)的過(guò)程中如何定時(shí)獲取access_token的方法,有需要的小伙伴可以參考下
    2020-02-02
  • 使用Puppeteer實(shí)現(xiàn)頁(yè)面遍歷的示例代碼

    使用Puppeteer實(shí)現(xiàn)頁(yè)面遍歷的示例代碼

    很多時(shí)候我們需要遍歷我們的頁(yè)面來(lái)檢查頁(yè)面是否存在問(wèn)題,以更好的保證可用性和安全性,下面就來(lái)講講如何使用puppeteer來(lái)實(shí)現(xiàn)頁(yè)面遍歷的功能吧
    2023-06-06
  • Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼

    Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼

    這篇文章主要介紹了Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Node.js控制臺(tái)彩色輸出的方法與原理實(shí)例詳解

    Node.js控制臺(tái)彩色輸出的方法與原理實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Node.js控制臺(tái)彩色輸出的方法與原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • NodeJs下的測(cè)試框架Mocha的簡(jiǎn)單介紹

    NodeJs下的測(cè)試框架Mocha的簡(jiǎn)單介紹

    本篇文章主要介紹了NodeJs下的測(cè)試框架Mocha的簡(jiǎn)單介紹,是目前最為流行的javascript框架之一,在本文我們重點(diǎn)介紹它在NodeJs上的使用。有興趣的可以了解一下。
    2017-02-02
  • nodejs?快速入門(mén)之事件循環(huán)

    nodejs?快速入門(mén)之事件循環(huán)

    這篇文章主要介紹了nodejs?快速入門(mén)之事件循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 淺談nodejs中的類(lèi)定義和繼承的套路

    淺談nodejs中的類(lèi)定義和繼承的套路

    本篇文章主要介紹了淺談nodejs中的類(lèi)定義和繼承的套路,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論

磴口县| 和平区| 绥江县| 小金县| 高州市| 斗六市| 靖江市| 广州市| 合江县| 斗六市| 伊宁市| 二连浩特市| 永康市| 勃利县| 抚顺市| 英吉沙县| 石林| 乐至县| 安远县| 玉门市| 刚察县| 云梦县| 天等县| 黄石市| 公安县| 阿瓦提县| 平武县| 辽宁省| 华坪县| 建昌县| 沙坪坝区| 通辽市| 辽阳市| 德庆县| 萨嘎县| 文化| 弋阳县| 西林县| 保山市| 富蕴县| 合作市|