編者按:本文轉(zhuǎn)載自 ThinkJS Web 服務(wù)的整個(gè)流程中,獲取數(shù)據(jù)是最重要的一環(huán),如何方便快捷的獲取用戶提交的數(shù)據(jù)減少開發(fā)者的開發(fā)成本是一個(gè) Web 服務(wù)框架應(yīng)該考慮的事情。本文將會(huì)為大家介紹在 ThinkJS 中請(qǐng)求數(shù)據(jù)解析和數(shù)據(jù)校驗(yàn)相關(guān)的內(nèi)容。 暫且不提 HTTP/2,HTTP 請(qǐng)求本質(zhì)上是一個(gè)有一定格式的文本字符串,程序按照規(guī)范格式解析后就能獲得我們想要的數(shù)據(jù)。不同的編碼方式需要我們使用不同的規(guī)范來解析請(qǐng)求體,在 ThinkJS 中提供了強(qiáng)大的數(shù)據(jù)解析中間件 think-payload,非常方便的將多種類型的請(qǐng)求體數(shù)據(jù)自動(dòng)轉(zhuǎn)換為 JavaScript 對(duì)象。 當(dāng)然在實(shí)現(xiàn)業(yè)務(wù)的過程中,我們發(fā)現(xiàn)簡(jiǎn)單的解析請(qǐng)求數(shù)據(jù)傳給業(yè)務(wù)層是不夠的,我們往往需要對(duì)用戶數(shù)據(jù)進(jìn)行各種校驗(yàn)和過濾,例如數(shù)據(jù)類型校驗(yàn)以及數(shù)據(jù)合法性校驗(yàn)等等。如果將這部分代碼和業(yè)務(wù)耦合在一塊的話會(huì)讓業(yè)務(wù)代碼變的非常的臃腫。所以 ThinkJS 中提供了非常方便的數(shù)據(jù)校驗(yàn)中間件 think-logic 增加 Logic 層來專門做數(shù)據(jù)校驗(yàn)邏輯,這樣就非常方便的將復(fù)雜的數(shù)據(jù)校驗(yàn)邏輯與業(yè)務(wù)代碼進(jìn)行了解耦。下圖展示了數(shù)據(jù)解析中間件和數(shù)據(jù)校驗(yàn)中間件在整個(gè)架構(gòu)中的位置。 下面我們就常見的請(qǐng)求數(shù)據(jù)類型來說一說在 ThinkJS 中的一些操作過程。 數(shù)據(jù)解析先回顧一下基礎(chǔ),HTTP 協(xié)議是基于傳輸層 TCP/IP 協(xié)議之上的應(yīng)用層協(xié)議,協(xié)議內(nèi)容是以 ASCII 碼傳輸?shù)模粋€(gè)正常的 HTTP 請(qǐng)求由狀態(tài)碼、請(qǐng)求頭、請(qǐng)求體組成的,像下面這樣:
HTTP 請(qǐng)求方法中,一般 POST 方法是用來提交數(shù)據(jù)的,協(xié)議規(guī)定 POST 方法提交的數(shù)據(jù)必須放在請(qǐng)求體中,明確數(shù)據(jù)的 MIME 類型,最終 HTTP 請(qǐng)求報(bào)文滿足上面的格式就可以了。數(shù)據(jù)發(fā)送到服務(wù)端后需要成功解析才能使用,像 PHP、Python、Golang、Node.js 的 Web 開發(fā)框架,都實(shí)現(xiàn)了解析數(shù)據(jù)的功能,基本上都是根據(jù)請(qǐng)求頭部 Content-Type 的數(shù)據(jù)類型,然后使用不同的方法進(jìn)行解析,下面介紹四種 POST 提交數(shù)據(jù)的常用 MIME 類型。 application/x-www-form-urlencoded這是一個(gè)經(jīng)常使用的 MIME 類型,HTML 中 |
|