想请教有关于 HTTP parse form 类型之 package 的原理
一般来说在 submit form 时我们都会使用 application/x-www-form-urlencoded(default)
与 multipart/form-data
这两种 Encryption 为主。于是我就好奇了相关的 package(body-parser 、node-formidable、multer 等)是如何解析的,不过我尝试 console 出 req(request)的 headers 却找不到 form 的本体,请问这是 HTTP 本身对于相关资讯会做的加密吗?想请教各位这方面是如何运作的。
以下是我尝试 submit 一 form,其中资讯有 { email: 'hello’, password: ‘test’ } ,所收到的 req(request)headers。(这是基于 express 底下回传的 req,不晓得是否有被 express 动过手脚)
{ host: 'localhost',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:35.0) Gecko/20100101 Firefox/35.0',
accept: '*/*',
'accept-language': 'en-US,en;q=0.5',
'accept-encoding': 'gzip, deflate',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'x-requested-with': 'XMLHttpRequest',
referer: 'http://localhost/login',
'content-length': '25',
cookie: 'jsbin=s%3Aj%3A%7B%22_csrf%22%3A%22EuAqXkQHR0vwM78bU%2BDROZ4B%22%2C%22flash%22%3A%7B%7D%7D.DIpnFp%2BmrfbErEhC3O2UXhx6JWkRutzeBRv0B308pvQ; _node=fd69ab210bd73bb0a5e5c34e0b15b618753315aa142180649818551c30df416b6b5f9eb9edbfa6a942ad6',
connection: 'keep-alive',
pragma: 'no-cache',
'cache-control': 'no-cache' }
以 body-parser 來說,解析 req.body
流程大概是這樣:
- 用 raw-body 解析最原始 HTTP request 取得 form 的「raw body」,這部分實作太底層我不懂,看看能否有其他人補充?
- 用 node.js 的 querystring 模組解析得到的「raw body」,如果有啟用 extended 選項,則是使用 TJ 寫的 qs(已經移轉給 hapi.js 團隊維護),最終都是輸出成可利用的 JSON object。
- 然後把 JSON object 寫入到
req.body
。
done。
@chinghanho 是的我有開啟 extended,以上的輸出結果就是被轉成 JSON 的 format。不過在 express 搭載的 body-parse 已經使用過 raw-body 後,經過其他過程中將初始 request 做了更動,這樣的話 …(我試試看等等再回報 @@")
在 Line 3993 可以见到经过 body-parser 解析过的 body: { email: 'hello’, password: ‘test’ }
不过还是没有在全文中找到相关形成 form 的资讯。
@DevinXian
Express 中得到的 req
已經是被處理過包裝後的 object,並不是從 HTTP 傳過來的「最原始的」request,所以這裏是看不到「request 原始形體」的。
HTTP request 的結構如何我沒有深入研究過,按照我的理解,submit form 本體不是放在 header 裡。我翻了一下網路上的資料,HTTP request 應該跟 HTML 有點像,分為 header 跟 body 兩個部分。
希望有知道的人可以解說一下。:D
@chinghanho 謝謝 HanHo,我在你附上的資料前一章節的 3.6.1 Chunked Transfer Coding 見道。Chunked-Body 似乎就是會存放 submit 出去 的 form 本體的區域,不過不確定是不是被 express 做完 parsing 後就將其移除了,亦或是它本身就不存在於 request 中(我個人認為不大可能,像我最前面提到的 node-formidable 它只需要傳入 req 就可以自動解析 multipart form,太神妙了)。 Q_Q