HTTP簡介
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的(de)縮寫,是用于從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地(dì)浏覽器的(de)傳送協議。
HTTP是一(yī)個基于TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。
HTTP是一(yī)個屬于應用層的(de)面向對象的(de)協議,由于其簡捷、快速的(de)方式,适用于分布式超媒體信息系統。它于1990年(nián)提出,經過幾年(nián)的(de)使用與發展,得到不斷地(dì)完善和(hé)擴展。目前在WWW中使用的(de)是HTTP/1.0的(de)第六版,HTTP/1.1的(de)規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的(de)建議已經提出。
HTTP協議工作于客戶端-服務端架構為(wèi)上。浏覽器作為(wèi)HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的(de)請求後,向客戶端發送響應信息。
http請求-響應模型.jpg
主要特點
1、簡單快速:客戶向服務器請求服務時,隻需傳送請求方法和(hé)路徑。請求方法常用的(de)有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的(de)類型不同。由于HTTP協議簡單,使得HTTP服務器的(de)程序規模小,因而通信速度很快。
2、靈活:HTTP允許傳輸任意類型的(de)數據對象。正在傳輸的(de)類型由Content-Type加以标記。
3.無連接:無連接的(de)含義是限制每次連接隻處理(lǐ)一(yī)個請求。服務器處理(lǐ)完客戶的(de)請求,并收到客戶的(de)應答後,即斷開連接。采用這種方式可(kě)以節省傳輸時間。
4.無狀态:HTTP協議是無狀态協議。無狀态是指協議對于事務處理(lǐ)沒有記憶能力。缺少狀态意味着如(rú)果後續處理(lǐ)需要前面的(de)信息,則它必須重傳,這樣可(kě)能導緻每次連接傳送的(de)數據量增大。另一(yī)方面,在服務器不需要先前信息時它的(de)應答就較快。
5、支持B/S及C/S模式。
HTTP之URL
HTTP使用統一(yī)資源标識符(Uniform Resource Identifiers, URI)來傳輸數據和(hé)建立連接。URL是一(yī)種特殊類型的(de)URI,包含了用于查找某個資源的(de)足夠的(de)信息
URL,全稱是UniformResourceLocator, 中文叫統一(yī)資源定位符,是互聯網上用來标識某一(yī)處資源的(de)地(dì)址。以下面這個URL為(wèi)例,介紹下普通URL的(de)各部分組成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的(de)URL可(kě)以看出,一(yī)個完整的(de)URL包括以下幾部分:
1.協議部分:該URL的(de)協議部分為(wèi)“http:”,這代表網頁使用的(de)是HTTP協議。在Internet中可(kě)以使用多種協議,如(rú)HTTP,FTP等等本例中使用的(de)是HTTP協議。在"HTTP"後面的(de)“//”為(wèi)分隔符
2.域名部分:該URL的(de)域名部分為(wèi)“www.aspxfans.com”。一(yī)個URL中,也可(kě)以使用IP地(dì)址作為(wèi)域名使用
3.端口部分:跟在域名後面的(de)是端口,域名和(hé)端口之間使用“:”作為(wèi)分隔符。端口不是一(yī)個URL必須的(de)部分,如(rú)果省略端口部分,将采用默認端口
4.虛拟目錄部分:從域名後的(de)第一(yī)個“/”開始到最後一(yī)個“/”為(wèi)止,是虛拟目錄部分。虛拟目錄也不是一(yī)個URL必須的(de)部分。本例中的(de)虛拟目錄是“/news/”
5.文件名部分:從域名後的(de)最後一(yī)個“/”開始到“?”為(wèi)止,是文件名部分,如(rú)果沒有“?”,則是從域名後的(de)最後一(yī)個“/”開始到“#”為(wèi)止,是文件部分,如(rú)果沒有“?”和(hé)“#”,那麽從域名後的(de)最後一(yī)個“/”開始到結束,都是文件名部分。本例中的(de)文件名是“index.asp”。文件名部分也不是一(yī)個URL必須的(de)部分,如(rú)果省略該部分,則使用默認的(de)文件名
6.錨部分:從“#”開始到最後,都是錨部分。本例中的(de)錨部分是“name”。錨部分也不是一(yī)個URL必須的(de)部分
7.參數部分:從“?”開始到“#”為(wèi)止之間的(de)部分為(wèi)參數部分,又稱搜索部分、查詢部分。本例中的(de)參數部分為(wèi)“boardID=5&ID=24618&page=1”。參數可(kě)以允許有多個參數,參數與參數之間用“&”作為(wèi)分隔符。
(原文:http://blog.csdn.net/ergouge/article/details/8185219 )
URI和(hé)URL的(de)區别
URI,是uniform resource identifier,統一(yī)資源标識符,用來唯一(yī)的(de)标識一(yī)個資源。
Web上可(kě)用的(de)每種資源如(rú)HTML文檔、圖像、視(shì)頻片段、程序等都是一(yī)個來URI來定位的(de)
URI一(yī)般由三部組成:
①訪問資源的(de)命名機制
②存放資源的(de)主機名
③資源自(zì)身的(de)名稱,由路徑表示,着重強調于資源。
URL是uniform resource locator,統一(yī)資源定位器,它是一(yī)種具體的(de)URI,即URL可(kě)以用來标識一(yī)個資源,而且還指明了如(rú)何locate這個資源。
URL是Internet上用來描述信息資源的(de)字符串,主要用在各種WWW客戶程序和(hé)服務器程序上,特别是著名的(de)Mosaic。
采用URL可(kě)以用一(yī)種統一(yī)的(de)格式來描述各種信息資源,包括文件、服務器的(de)地(dì)址和(hé)目錄等。URL一(yī)般由三部組成:
①協議(或稱為(wèi)服務方式)
②存有該資源的(de)主機IP地(dì)址(有時也包括端口号)
③主機資源的(de)具體地(dì)址。如(rú)目錄和(hé)文件名等
URN,uniform resource name,統一(yī)資源命名,是通過名字來标識資源,比如(rú)mailto:java-net@java.sun.com。
URI是以一(yī)種抽象的(de),高(gāo)層次概念定義統一(yī)資源标識,而URL和(hé)URN則是具體的(de)資源标識的(de)方式。URL和(hé)URN都是一(yī)種URI。籠統地(dì)說,每個 URL 都是 URI,但不一(yī)定每個 URI 都是 URL。這是因為(wèi) URI 還包括一(yī)個子(zǐ)類,即統一(yī)資源名稱 (URN),它命名資源但不指定如(rú)何定位資源。上面的(de) mailto、news 和(hé) isbn URI 都是 URN 的(de)示例。
在Java的(de)URI中,一(yī)個URI實例可(kě)以代表絕對的(de),也可(kě)以是相對的(de),隻要它符合URI的(de)語法規則。而URL類則不僅符合語義,還包含了定位該資源的(de)信息,因此它不能是相對的(de)。
在Java類庫中,URI類不包含任何訪問資源的(de)方法,它唯一(yī)的(de)作用就是解析。
相反的(de)是,URL類可(kě)以打開一(yī)個到達資源的(de)流。
HTTP之請求消息Request
客戶端發送一(yī)個HTTP請求到服務器的(de)請求消息包括以下格式:
請求行(request line)、請求頭部(header)、空行和(hé)請求數據四個部分組成。
Http請求消息結構.png
請求行以一(yī)個方法符号開頭,以空格分開,後面跟着請求的(de)URI和(hé)協議的(de)版本。
Get請求例子(zǐ),使用Charles抓取的(de)request:
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一(yī)部分:請求行,用來說明請求類型,要訪問的(de)資源以及所使用的(de)HTTP版本.
GET說明請求類型為(wèi)GET,[/562f25980001b1b106000338.jpg]為(wèi)要訪問的(de)資源,該行的(de)最後一(yī)部分說明使用的(de)是HTTP1.1版本。
第二部分:請求頭部,緊接着請求行(即第一(yī)行)之後的(de)部分,用來說明服務器要使用的(de)附加信息
從第二行起為(wèi)請求頭部,HOST将指出請求的(de)目的(de)地(dì).User-Agent,服務器端和(hé)客戶端腳本都能訪問它,它是浏覽器類型檢測邏輯的(de)重要基礎.該信息由你的(de)浏覽器來定義,并且在每個請求中自(zì)動發送等等
第三部分:空行,請求頭部後面的(de)空行是必須的(de)
即使第四部分的(de)請求數據為(wèi)空,也必須有空行。
第四部分:請求數據也叫主體,可(kě)以添加任意的(de)其他數據。
這個例子(zǐ)的(de)請求數據為(wèi)空。
POST請求例子(zǐ),使用Charles抓取的(de)request:
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一(yī)部分:請求行,第一(yī)行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的(de)空行。
第四部分:請求數據,第八行。
HTTP之響應消息Response
一(yī)般情況下,服務器接收并處理(lǐ)客戶端發過來的(de)請求後會返回一(yī)個HTTP的(de)響應消息。
HTTP響應也由四個部分組成,分别是:狀态行、消息報頭、空行和(hé)響應正文。
http響應消息格式.jpg
例子(zǐ)
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一(yī)部分:狀态行,由HTTP協議版本号, 狀态碼, 狀态消息 三部分組成。
第一(yī)行為(wèi)狀态行,(HTTP/1.1)表明HTTP版本為(wèi)1.1版本,狀态碼為(wèi)200,狀态消息為(wèi)(ok)
第二部分:消息報頭,用來說明客戶端要使用的(de)一(yī)些附加信息
第二行和(hé)第三行為(wèi)消息報頭,
Date:生成響應的(de)日期和(hé)時間;Content-Type:指定了MIME類型的(de)HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報頭後面的(de)空行是必須的(de)
第四部分:響應正文,服務器返回給客戶端的(de)文本信息。
空行後面的(de)html部分為(wèi)響應正文。
HTTP之狀态碼
狀态代碼有三位數字組成,第一(yī)個數字定義了響應的(de)類别,共分五種類别:
1xx:指示信息--表示請求已接收,繼續處理(lǐ)
2xx:成功--表示請求已被成功接收、理(lǐ)解、接受
3xx:重定向--要完成請求必須進行更進一(yī)步的(de)操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的(de)請求
常見狀态碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理(lǐ)解
401 Unauthorized //請求未經授權,這個狀态代碼必須和(hé)WWW-Authenticate報頭域一(yī)起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的(de)URL
500 Internal Server Error //服務器發生不可(kě)預期的(de)錯誤
503 Server Unavailable //服務器當前不能處理(lǐ)客戶端的(de)請求,一(yī)段時間後可(kě)能恢複正常
更多狀态碼http://www.runoob.com/http/http-status-codes.html
HTTP請求方法
根據HTTP标準,HTTP請求可(kě)以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和(hé) HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和(hé) CONNECT 方法。
GET 請求指定的(de)頁面信息,并返回實體主體。
HEAD 類似于get請求,隻不過返回的(de)響應中沒有具體的(de)內(nèi)容,用于獲取報頭
POST 向指定資源提交數據進行處理(lǐ)請求(例如(rú)提交表單或者上傳文件)。數據被包含在請求體中。POST請求可(kě)能會導緻新的(de)資源的(de)建立和(hé)/或已有資源的(de)修改。
PUT 從客戶端向服務器傳送的(de)數據取代指定的(de)文檔的(de)內(nèi)容。
DELETE 請求服務器删除指定的(de)頁面。
CONNECT HTTP/1.1協議中預留給能夠将連接改為(wèi)管道(dào)方式的(de)代理(lǐ)服務器。
OPTIONS 允許客戶端查看服務器的(de)性能。
TRACE 回顯服務器收到的(de)請求,主要用于測試或診斷。
HTTP工作原理(lǐ)
HTTP協議定義Web客戶端如(rú)何從Web服務器請求Web頁面,以及服務器如(rú)何把Web頁面傳送給客戶端。HTTP協議采用了請求/響應模型。客戶端向服務器發送一(yī)個請求報文,請求報文包含請求的(de)方法、URL、協議版本、請求頭部和(hé)請求數據。服務器以一(yī)個狀态行作為(wèi)響應,響應的(de)內(nèi)容包括協議的(de)版本、成功或者錯誤代碼、服務器信息、響應頭部和(hé)響應數據。
以下是 HTTP 請求/響應的(de)步驟:
1、客戶端連接到Web服務器
一(yī)個HTTP客戶端,通常是浏覽器,與Web服務器的(de)HTTP端口(默認為(wèi)80)建立一(yī)個TCP套接字連接。例如(rú),http://www.oakcms.cn。
2、發送HTTP請求
通過TCP套接字,客戶端向Web服務器發送一(yī)個文本的(de)請求報文,一(yī)個請求報文由請求行、請求頭部、空行和(hé)請求數據4部分組成。
3、服務器接受請求并返回HTTP響應
Web服務器解析請求,定位請求資源。服務器将資源複本寫到TCP套接字,由客戶端讀取。一(yī)個響應由狀态行、響應頭部、空行和(hé)響應數據4部分組成。
4、釋放連接TCP連接
若connection 模式為(wèi)close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為(wèi)keepalive,則該連接會保持一(yī)段時間,在該時間內(nèi)可(kě)以繼續接收請求;
5、客戶端浏覽器解析HTML內(nèi)容
客戶端浏覽器首先解析狀态行,查看表明請求是否成功的(de)狀态代碼。然後解析每一(yī)個響應頭,響應頭告知以下為(wèi)若幹字節的(de)HTML文檔和(hé)文檔的(de)字符集。客戶端浏覽器讀取響應數據HTML,根據HTML的(de)語法對其進行格式化,并在浏覽器窗口中顯示。
例如(rú):在浏覽器地(dì)址欄鍵入URL,按下回車之後會經曆以下流程:
1、浏覽器向 DNS 服務器請求解析該 URL 中的(de)域名所對應的(de) IP 地(dì)址;
2、解析出 IP 地(dì)址後,根據該 IP 地(dì)址和(hé)默認端口 80,和(hé)服務器建立TCP連接;
3、浏覽器發出讀取文件(URL 中域名後面部分對應的(de)文件)的(de)HTTP 請求,該請求報文作為(wèi) TCP 三次握手的(de)第三個報文的(de)數據發送給服務器;
4、服務器對浏覽器請求作出響應,并把對應的(de) html 文本發送給浏覽器;
5、釋放 TCP連接;
6、浏覽器将該 html 文本并顯示內(nèi)容;
GET和(hé)POST請求的(de)區别
GET請求
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意最後一(yī)行是空行
POST請求
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
1、GET提交,請求的(de)數據會附在URL之後(就是把數據放置在HTTP協議頭中),以?分割URL和(hé)傳輸數據,多個參數用&連接;例 如(rú):login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如(rú)果數據是英文字母/數字,原樣發送,如(rú)果是空格,轉換為(wèi)+,如(rú)果是中文/其他字符,則直接把字符串用BASE64加密,得出如(rú): %E4%BD%A0%E5%A5%BD,其中%XX中的(de)XX為(wèi)該符号以16進制表示的(de)ASCII。
POST提交:把提交的(de)數據放置在是HTTP包的(de)包體中。上文示例中紅(hóng)色字體标明的(de)就是實際的(de)傳輸數據
因此,GET提交的(de)數據會在地(dì)址欄中顯示出來,而POST提交,地(dì)址欄不會改變
2、傳輸數據的(de)大小:首先聲明:HTTP協議沒有對傳輸的(de)數據大小進行限制,HTTP協議規範也沒有對URL長(cháng)度進行限制。
而在實際開發中存在的(de)限制主要有:
GET:特定浏覽器和(hé)服務器對URL長(cháng)度有限制,例如(rú) IE對URL長(cháng)度的(de)限制是2083字節(2K+35)。對于其他浏覽器,如(rú)Netscape、FireFox等,理(lǐ)論上沒有長(cháng)度限制,其限制取決于操作系 統的(de)支持。
因此對于GET提交時,傳輸數據就會受到URL長(cháng)度的(de) 限制。
POST:由于不是通過URL傳值,理(lǐ)論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自(zì)的(de)配置。
3、安全性
POST的(de)安全性要比GET的(de)安全性高(gāo)。比如(rú):通過GET提交數據,用戶名和(hé)密碼将明文出現在URL上,因為(wèi)(1)登錄頁面有可(kě)能被浏覽器緩存;(2)其他人查看浏覽器的(de)曆史紀錄,那麽别人就可(kě)以拿到你的(de)賬号和(hé)密碼了,除此之外,使用GET提交數據還可(kě)能會造成Cross-site request forgery攻擊
4、Http get,post,soap協議都是在http上運行的(de)
(1)get:請求參數是作為(wèi)一(yī)個key/value對的(de)序列(查詢字符串)附加到URL上的(de)
查詢字符串的(de)長(cháng)度受到web浏覽器和(hé)web服務器的(de)限制(如(rú)IE最多支持2048個字符),不适合傳輸大型數據集同時,它很不安全
(2)post:請求參數是在http标題的(de)一(yī)個不同部分(名為(wèi)entity body)傳輸的(de),這一(yī)部分用來傳輸表單信息,因此必須将Content-type設置為(wèi):application/x-www-form- urlencoded。post設計用來支持web窗體上的(de)用戶字段,其參數也是作為(wèi)key/value對傳輸。
但是:它不支持複雜數據類型,因為(wèi)post沒有定義傳輸數據結構的(de)語義和(hé)規則。
(3)soap:是http post的(de)一(yī)個專用版本,遵循一(yī)種特殊的(de)xml消息格式
Content-type設置為(wèi): text/xml 任何數據都可(kě)以xml化。
Http協議定義了很多與服務器交互的(de)方法,最基本的(de)有4種,分别是GET,POST,PUT,DELETE. 一(yī)個URL地(dì)址用于描述一(yī)個網絡上的(de)資源,而HTTP中的(de)GET, POST, PUT, DELETE就對應着對這個資源的(de)查,改,增,删4個操作。 我們最常見的(de)就是GET和(hé)POST了。GET一(yī)般用于獲取/查詢資源信息,而POST一(yī)般用于更新資源信息.
我們看看GET和(hé)POST的(de)區别
GET提交的(de)數據會放在URL之後,以?分割URL和(hé)傳輸數據,參數之間以&相連,如(rú)EditPosts.aspx?name=test1&id=123456. POST方法是把提交的(de)數據放在HTTP包的(de)Body中.
GET提交的(de)數據大小有限制(因為(wèi)浏覽器對URL的(de)長(cháng)度有限制),而POST方法提交的(de)數據沒有限制.
GET方式需要使用Request.QueryString來取得變量的(de)值,而POST方式通過Request.Form來獲取變量的(de)值。
GET方式提交數據,會帶來安全問題,比如(rú)一(yī)個登錄頁面,通過GET方式提交數據時,用戶名和(hé)密碼将出現在URL上,如(rú)果頁面可(kě)以被緩存或者其他人可(kě)以訪問這台機器,就可(kě)以從曆史記錄獲得該用戶的(de)賬号和(hé)密碼.
編輯:--ns868