在做web前端開發(fā)時惩系,我們必須要知道客戶端和服務端是如何通信的堡牡,通俗簡單點就是? 請求(客戶端)? R11 > 響應
(服務端)的過程擦剑,可是客戶端又是如何向服務端如何請求的呢赚抡?而服務端又是如何響應的呢涂臣,響應的信息又是不是我們想要的呢赁遗?帶著問題往下看吧。
HTTP(HyperText TransferProtocol)是一套計算機通過網絡進行通信的規(guī)則炫乓。計算機專家設計出HTTP,使HTTP客戶(如Web瀏覽器)能夠從HTTP服務器(Web服務器)請求信息和服務箩做,HTTP協議目前的版本是1.1.HTTP是一種無狀態(tài)的協議,無狀態(tài)是指Web瀏覽器和Web服務器之間不需要建立持久的連接,這意味著當一個客戶端向服務器端發(fā)出請求黔龟,然后Web服務器返回響應(response),連接就被關閉了,在服務器端不保留連接的有關信息.HTTP遵循請求(Request)/應答(Response)模型到踏。Web瀏覽器向Web服務器發(fā)送請求夭禽,Web服務器處理請求并返回適當的應答菩彬。所有HTTP連接都被構造成一套請求和應答骗灶。
HTTP使用內容類型脱羡,是指Web服務器向Web瀏覽器返回的文件都有與之相關的類型。所有這些類型在MIMEInternet郵件協議上模型化脓规,即Web服務器告訴Web瀏覽器該文件所具有的種類,是HTML文檔挨下、GIF格式圖像、聲音文件還是獨立的應用程序。大多數Web瀏覽器都擁有一系列的可配置的輔助應用程序帜讲,它們告訴瀏覽器應該如何處理Web服務器發(fā)送過來的各種內容類型获黔。
HTTP通信機制是在一次完整的HTTP通信過程中腋舌,Web瀏覽器與Web服務器之間將完成下列7個步驟:
(1)?建立TCP連接
在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的糟需,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族谷朝,因此Internet又被稱作是TCP/IP網絡洲押。HTTP是比TCP更高層次的應用層協議,根據規(guī)則圆凰,只有低層協議建立之后才能诅诱,才能進行更層協議的連接,因此送朱,首先要建立TCP連接娘荡,一般TCP連接的端口號是80
(2)?Web瀏覽器向Web服務器發(fā)送請求命令
一旦建立了TCP連接,Web瀏覽器就會向Web服務器發(fā)送請求命令
例如:GET/sample/hello.jsp HTTP/1.1
(3)?Web瀏覽器發(fā)送請求頭信息
瀏覽器發(fā)送其請求命令之后驶沼,還要以頭信息的形式向Web服務器發(fā)送一些別的信息炮沐,之后瀏覽器發(fā)送了一空白行來通知服務器,它已經結束了該頭信息的發(fā)送回怜。
(4)?Web服務器應答
客戶機向服務器發(fā)出請求后大年,服務器會客戶機回送應答,
HTTP/1.1 200 OK
應答的第一部分是協議的版本號和應答狀態(tài)碼
(5)?Web服務器發(fā)送應答頭信息
正如客戶端會隨同請求發(fā)送關于自身的信息一樣玉雾,服務器也會隨同應答向用戶發(fā)送關于它自己的數據及被請求的文檔翔试。
(6)?Web服務器向瀏覽器發(fā)送數據
Web服務器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結束复旬,接著垦缅,它就以Content-Type應答頭信息所描述的格式發(fā)送用戶所請求的實際數據
(7)?Web服務器關閉TCP連接
一般情況下,一旦Web服務器向瀏覽器發(fā)送了請求數據驹碍,它就要關閉TCP連接壁涎,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發(fā)送后將仍然保持打開狀態(tài)凡恍,于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求怔球。保持連接節(jié)省了為每個請求建立新連接所需的時間嚼酝,還節(jié)約了網絡帶寬。
HTTP請求格式
當瀏覽器向Web服務器發(fā)出請求時竟坛,它向服務器傳遞了一個數據塊闽巩,也就是請求信息,HTTP請求信息由3部分組成:
l?請求方法URI協議/版本
l?請求頭(Request Header)
l?請求正文
下面是一個HTTP請求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,/
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
(1)?請求方法URI協議/版本
請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1
以上代碼中“GET”代表請求方法担汤,“/sample.jsp”表示URI涎跨,“HTTP/1.1代表協議和協議的版本。
根據HTTP標準漫试,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET碘赖、POST驾荣、HEAD、OPTIONS普泡、PUT播掷、DELETE和TARCE。在Internet應用中撼班,最常用的方法是GET和POST歧匈。
URL完整地指定了要訪問的網絡資源,通常只要給出相對于服務器的根目錄的相對目錄即可砰嘁,因此總是以“/”開頭件炉,最后,協議版本聲明了通信過程中使用HTTP的版本矮湘。
(2)請求頭(Request Header)
請求頭包含許多有關的客戶端環(huán)境和請求正文的有用信息斟冕。例如,請求頭可以聲明瀏覽器所用的語言缅阳,請求正文的長度等磕蛇。
Accept:image/gif.image/jpeg./
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
(3)請求正文
請求頭和請求正文之間是一個空行,這個行非常重要十办,它表示請求頭已經結束秀撇,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
username=jinqiao&password=1234
在以上的例子的HTTP請求中向族,請求的正文只有一行內容呵燕。當然,在實際應用中件相,HTTP請求正文可以包含更多的內容虏等。
HTTP請求方法我這里只討論GET方法與POST方法
GET方法
GET方法是默認的HTTP請求方法弄唧,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼霍衫,同時它將作為URL的一部分向Web服務器發(fā)送候引,因此,如果使用GET方法來提交表單數據就存在著安全隱患上敦跌。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
從上面的URL請求中澄干,很容易就可以辯認出表單提交的內容。(柠傍?之后的內容)另外由于GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大
POST方法
POST方法是GET方法的一個替代方法麸俘,它主要是向Web服務器提交表單數據,尤其是大批量的數據惧笛。POST方法克服了GET方法的一些缺點从媚。通過POST方法提交表單數據時,數據不是作為URL請求的一部分而是作為標準數據傳送給Web服務器患整,這就克服了GET方法中的信息無法保密和數據量太小的缺點拜效。因此,出于安全的考慮以及對用戶隱私的尊重各谚,通常表單提交時采用POST方法紧憾。
從編程的角度來講,如果用戶通過GET方法提交數據昌渤,則數據存放在QUERY_STRING環(huán)境變量中赴穗,而POST方法提交的數據則可以從標準輸入流中獲取。
HTTP應答與HTTP請求相似膀息,HTTP響應也由3個部分構成般眉,分別是:
1 協議狀態(tài)版本代碼描述
2 響應頭(Response Header)
3 響應正文
下面是一個HTTP響應的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112