我們知道瀏覽器是http(s)的客戶端,目的是連接遠(yuǎn)程的http服務(wù)器,然后服務(wù)器返回瀏覽器數(shù)據(jù).瀏覽器接收數(shù)據(jù)解析數(shù)據(jù)之后展現(xiàn)出來.我們看到的外在表現(xiàn)就是,瀏覽器訪問一個url,然后就得到相應(yīng)的web頁面.
同樣我們知道,瀏覽器與http服務(wù)器是通過http協(xié)議,傳輸層是tcp協(xié)議,因為他是有連接,可靠的協(xié)議.關(guān)于http協(xié)議簡單的介紹一下:
一個標(biāo)準(zhǔn)的HTTP請求由以下幾個部分組成
- <request-line>
- <headers>
- <CRLF>
- [<request-body><CRLF>]
在HTTP請求中,第一行是請求行(request-line),用來說明請求類型、要訪問的資源(URL)以及使用的HTTP版本; 緊接著是多行頭部(headers)信息,用來說明服務(wù)器要使用的附加信息; 頭部信息之后是一個回車換行符( ),用于標(biāo)明頭部信息的結(jié)束。 以上是必須內(nèi)容,根據(jù)需要可在頭部信息結(jié)束之后增加主體數(shù)據(jù)(request-body);
主體數(shù)據(jù)之后是一個回車換行符( ),用于標(biāo)明主體數(shù)據(jù)的結(jié)束。
例如,我們可以在IE瀏覽器上輸入下面的網(wǎng)址:
- http://localhost:8000/hello/index.html
HTTP請求的頭部信息如下:
- GET /hello/index.html HTTP/1.1
- Accept: */*
- Accept-Language: zh-cn
- Accept-Encoding: gzip, deflate
- Host: localhost:8000
- Connection: Keep-Alive
- Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6
收到請求數(shù)據(jù)之后,服務(wù)器解析,畢竟是明文字符,這個簡單.然后服務(wù)器就知道了客戶端的要求--獲取目錄hello/index.html文件.服務(wù)器讀取文件內(nèi)容發(fā)送給瀏覽器就好了.
后來隨著業(yè)務(wù)邏輯越來越復(fù)雜,單單獲取某個html文件功能早已不能滿足需求,個性化需求呼之欲出.比如在線問卷調(diào)查表,他究竟是怎么把我們填寫的數(shù)據(jù)傳遞給服務(wù)器的呢?
你可能會說那不是一樣,客戶端發(fā)送什么內(nèi)容,服務(wù)器就接收什么內(nèi)容.可是你想過沒有,每個網(wǎng)站的需求是不一樣的,本來服務(wù)器接收到瀏覽器的請求數(shù)據(jù)已經(jīng)是夠復(fù)雜的了,還讓服務(wù)器來解析數(shù)據(jù)并響應(yīng)不同的數(shù)據(jù)處理,這不太現(xiàn)實.
一般的,服務(wù)器最好只接收數(shù)據(jù),如果讓服務(wù)器也處理數(shù)據(jù)邏輯,勢必會讓服務(wù)器變得很復(fù)雜,穩(wěn)定性也得不到保證.
另外一個角度是為了讓程序復(fù)用,提高生產(chǎn)效率.也就是說,如果不關(guān)注業(yè)務(wù)邏輯,只注重接收數(shù)據(jù),那么服務(wù)器程序可以給任何一個開發(fā)者使用.換句話說,我們不用從頭開始寫.直接使用現(xiàn)有的高性能的服務(wù)器就可以滿足需求了.例如公司白領(lǐng)中午要吃飯,不可能跑回家自己去做飯吃,自己叫外賣就好了.
但是現(xiàn)實問題仍然沒有解決,通過什么方式去處理業(yè)務(wù)邏輯呢?
你要給手機充電時,把插頭插入插線板就能獲取電了.插線板有接口,提供了電.
同理服務(wù)器程序最好也提供接口,瀏覽器通過統(tǒng)一的接口給服務(wù)器,然后我們從服務(wù)器接口中獲取我們想要的數(shù)據(jù).獲取數(shù)據(jù)之后我們可以把數(shù)據(jù)交給第三方程序來處理邏輯,這樣就做到與服務(wù)器業(yè)務(wù)分離了,good iead.
事實上,現(xiàn)在的http服務(wù)器就是這么做的,不過很復(fù)雜而已.下一篇開始為您介紹這些接口.
附錄:HTTP Request Header 請求頭
Header |
解釋 |
示例 |
---|---|---|
Accept |
指定客戶端能夠接收的內(nèi)容類型 |
Accept: text/plain, text/html |
Accept-Charset |
瀏覽器可以接受的字符編碼集。 |
Accept-Charset: iso-8859-5 |
Accept-Encoding |
指定瀏覽器可以支持的web服務(wù)器返回內(nèi)容壓縮編碼類型。 |
Accept-Encoding: compress, gzip |
Accept-Language |
瀏覽器可接受的語言 |
Accept-Language: en,zh |
Accept-Ranges |
可以請求網(wǎng)頁實體的一個或者多個子范圍字段 |
Accept-Ranges: bytes |
Authorization |
HTTP授權(quán)的授權(quán)證書 |
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control |
指定請求和響應(yīng)遵循的緩存機制 |
Cache-Control: no-cache |
Connection |
表示是否需要持久連接。(HTTP 1.1默認(rèn)進(jìn)行持久連接) |
Connection: close |
Cookie |
HTTP請求發(fā)送時,會把保存在該請求域名下的所有cookie值一起發(fā)送給web服務(wù)器。 |
Cookie: $Version=1; Skin=new; |
Content-Length |
請求的內(nèi)容長度 |
Content-Length: 348 |
Content-Type |
請求的與實體對應(yīng)的MIME信息 |
Content-Type: application/x-www-form-urlencoded |
Date |
請求發(fā)送的日期和時間 |
Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect |
請求的特定的服務(wù)器行為 |
Expect: 100-continue |
From |
發(fā)出請求的用戶的Email |
From: user@email.com |
Host |
指定請求的服務(wù)器的域名和端口號 |
Host: www.zcmhi.com |
If-Match |
只有請求內(nèi)容與實體相匹配才有效 |
If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since |
如果請求的部分在指定時間之后被修改則請求成功,未被修改則返回304代碼 |
If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match |
如果內(nèi)容未改變返回304代碼,參數(shù)為服務(wù)器先前發(fā)送的Etag,與服務(wù)器回應(yīng)的Etag比較判斷是否改變 |
If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range |
如果實體未改變,服務(wù)器發(fā)送客戶端丟失的部分,否則發(fā)送整個實體。參數(shù)也為Etag |
If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since |
只在實體在指定時間之后未被修改才請求成功 |
If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards |
限制信息通過代理和網(wǎng)關(guān)傳送的時間 |
Max-Forwards: 10 |
Pragma |
用來包含實現(xiàn)特定的指令 |
Pragma: no-cache |
Proxy-Authorization |
連接到代理的授權(quán)證書 |
Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range |
只請求實體的一部分,指定范圍 |
Range: bytes=500-999 |
Referer |
先前網(wǎng)頁的地址,當(dāng)前請求網(wǎng)頁緊隨其后,即來路 |
Referer: http://www.zcmhi.com/archives/71.html |
TE |
客戶端愿意接受的傳輸編碼,并通知服務(wù)器接受接受尾加頭信息 |
TE: trailers,deflate;q=0.5 |
Upgrade |
向服務(wù)器指定某種傳輸協(xié)議以便服務(wù)器進(jìn)行轉(zhuǎn)換(如果支持) |
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent |
User-Agent的內(nèi)容包含發(fā)出請求的用戶信息 |
User-Agent: Mozilla/5.0 (Linux; X11) |
Via |
通知中間網(wǎng)關(guān)或代理服務(wù)器地址,通信協(xié)議 |
Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning |
關(guān)于消息實體的警告信息 |
Warn: 199 Miscellaneous warning |