您當前位置: 南順網絡>> 官方資訊>> 建站知識

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