對不同格式請求參數處理(附帶一點文件上傳)
不論通過什麼樣的方式發送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屬性