對不同格式請求參數處理(附帶一點文件上傳)

不論通過什麼樣的方式發送URL請求, 都遵守這樣的URL構成規則:

URL由三部分組成: 
請求地址: 即URL鏈接
請求參數: 包括請求體  和  附著在URL鏈接後的參數
請求配置: 包括請求頭設置和其它各種說明請求信息的配置
 
這裡只考慮對請求參數處理的過程.
即客戶端發送URL請求的時候對請求參數是如何處理的, 參數是以什麼樣的形式被發送的;  服務端接收處理URL請求的時候, 接收的請求參數是什麼樣的形式, 以及如何處理請求參數的.
當我們通過各種不同的方式(不管是前端還是後端, 不管是什麼軟件, 不管是jquery或者axios), 請求參數都是以對象的形式被配置好, (可以是FormData對象, {"key":"value"}普通對象, 也可以是任何形式的非普通對象)
當把URL請求配置好並點擊發送的時候, 發送請求的工具會首先將請求參數對象編碼成json字符串, 請求對象裡面的數據(包括文本數據和二進制數據(文件數據)和其它一切形式的數據)都會被編碼成json字符串.
接收端接收到URL請求之後, 會根據請求配置中的請求頭中的{"content-type": "請求參數格式"}, 按照其中註明的格式, 對請求參數進行提取, 並把提取出的數據封裝到相對應的對象當中, 這個過程,不同的編碼語言和不同的框架會對其做不同的處理. 
但是有一點需要注意, 由數客戶端發送POST請求的時候, 默認的Content-Type為"application/x-www-form-urlencoded", 所有後端接收請求時常常會配置此種類型請求參數的配置, 但是忽略解析其它類型的請求參數的配置.
總之, 概括起來是這樣的, 當在服務端配置請求接口(請求路由)的時候, 還需要配置對該請求將要接收(後端的請求接口要根據前端的請求進行編寫)的請求參數的解析標準. (這是我之前寫代碼是常常忽略的, 所以導致不會處理文件上傳類的需求, 主要是不明白其中的原理)
常用的Content-Type有: 

application/x-www-form-urlencoded: 表示请求或响应中的数据是键值对形式(key:value)
application/json: 表示请求或响应中的数据json对象的形式
application/pdf:表示请求或响应中的数据是PDF文档格式。
multipart/form-data:表单数据;常用于文件上传.
這裡這裡僅以Node中的Express框架為例, 介紹如何處理不同格式的請求參數.

對application/json形式的請求參數處理: 

通過解析中間件express.json, 只需要在app程序對象中插入中間件app.use(express.json()); 即可在req.body中獲取請求參數

對application/x-www-form-urlencoded形式的請求參數處理:

通過解析中間件body-parser, 只需要在app程序對象中插入中間件app.use(bodyParser.urlencoded({entended: true}); 即可在req.body中獲取請求參數

對multipart/form-data形式的請求參數處理:

需自行設置, 經multer中間件解析之後, 文本屬性被解析到req.body中, 文件屬性被解析到req.file(單文件上傳)或req.files(多文件上傳)中, 此時的file或files只包含了對文件的描述信息, 二進制數據已經經過multer中間件被存儲到了自定義的位置了.  只有當存儲方式為MemoryStorage(存儲到內存中)時, file對象才會擁有buffer屬性

posted @ 2023-07-03 15:37  0龙行者0  阅读(2)  评论(0编辑  收藏  举报