1.HTTP定義 html
HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和創建鏈接。web
2.什麼是URL?ajax
全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。如下面這個URL爲例,介紹下普通URL的各部分組瀏覽器
成:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name緩存
2.1協議安全
該URL的協議部分爲「http:」,這表明網頁使用的是HTTP協議。在Internet中可使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的「//」爲分隔符服務器
2.2域名cookie
該URL的域名部分爲「www.aspxfans.com」。一個URL中,也可使用IP地址做爲域名使用網絡
2.3端口數據結構
跟在域名後面的是端口,域名和端口之間使用「:」做爲分隔符。端口不是一個URL必須的部分,若是省略端口部分,將採用默認端口
2.4虛擬目錄
從域名後的第一個「/」開始到最後一個「/」爲止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是「/news/」
2.5文件名
從域名後的最後一個「/」開始到「?」爲止,是文件名部分,若是沒有「?」,則是從域名後的最後一個「/」開始到「#」爲止,是文件部分,若是沒有「?」和「#」,那麼從域名後的最後一個「/」開始到結束,都是文件名部分。本例中的文件名是「index.asp」。文件名部分也不是一個URL必須的部分,若是省略該部分,則使用默認的文件
2.6錨
從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是一個URL必須的部分
2.7參數
從「?」開始到「#」爲止之間的部分爲參數部分,又稱搜索部分、查詢部分。本例中的參數部分爲「boardID=5&ID=24618&page=1」。參數能夠容許有多個參數,參數與參數之間用「&」做爲分隔符。
2.1什麼是URI?
URI是uniform resource identifier,統一資源標識符,用來惟一的標識一個資源。Web上可用的每種資源如HTML文檔、圖像、視頻片斷、程序等都是一個來URI來定位的
2.2URI的組成
通常由三部組成:
①訪問資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,着重強調於資源。
2.3什麼是URL?
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL能夠用來標識一個資源,並且還指明瞭如何locate這個資源。URL是Internet上用來描述信息資源的字符串,主要用在各類WWW客戶程序和服務器程序上,特別是著名的Mosaic。
採用URL能夠用一種統一的格式來描述各類信息資源,包括文件、服務器的地址和目錄等。
2.4URL的組成
通常由三部組成:
①協議(或稱爲服務方式)
②存有該資源的主機IP地址(有時也包括端口號)
③主機資源的具體地址。如目錄和文件名等
Response 消息中的第一行叫作狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別
1XX 提示信息 - 表示請求已被成功接收,繼續處理
2XX 成功 - 表示請求已被成功接收,理解,接受
3XX 重定向 - 要完成請求必須進行更進一步的處理
4XX 客戶端錯誤 - 請求有語法錯誤或請求沒法實現
5XX 服務器端錯誤 - 服務器未能實現合法的請求
200:表示請求成功
201 正常;緊接 POST 命令。
202 正常;已接受用於處理,但處理還沒有完成。
203 正常;部分信息 — 返回的信息只是一部分。
204 正常;無響應 — 已接收請求,但不存在要回送的信息。
3xx 重定向
301 已移動 — 請求的數據具備新的位置且更改是永久的。
302 已找到 — 請求的數據臨時具備不一樣 URI。
303 請參閱其它 — 可在另外一 URI 下找到對請求的響應,且應使用 GET 方法檢索此響應。
304 未修改 — 未按預期修改文檔。
305 使用代理 — 必須經過位置字段中提供的代理來訪問請求的資源。
306 未使用 — 再也不使用;保留此代碼以便未來使用。
4xx 客戶機中出現的錯誤
400 錯誤請求 — 請求中有語法問題,或不能知足請求。
401 未受權 — 未受權客戶機訪問數據。
402 須要付款 — 表示計費系統已有效。
403 禁止 — 即便有受權也不須要訪問。
404 找不到 — 服務器找不到給定的資源;文檔不存在。
407 代理認證請求 — 客戶機首先必須使用代理認證自身。
415 介質類型不受支持 — 服務器拒絕服務請求,由於不支持請求實體的格式。
HTTP 400 - 請求無效
HTTP 401.1 - 未受權:登陸失敗
HTTP 401.2 - 未受權:服務器配置問題致使登陸失敗
HTTP 401.3 - ACL 禁止訪問資源
HTTP 401.4 - 未受權:受權被篩選器拒絕
HTTP 401.5 - 未受權:ISAPI 或 CGI 受權失敗
HTTP 403 - 禁止訪問
HTTP 403 - 對 Internet 服務管理器 (HTML) 的訪問僅限於 Localhost
HTTP 403.1 禁止訪問:禁止可執行訪問
HTTP 403.2 - 禁止訪問:禁止讀訪問
HTTP 403.3 - 禁止訪問:禁止寫訪問
HTTP 403.4 - 禁止訪問:要求 SSL
HTTP 403.5 - 禁止訪問:要求 SSL 128
HTTP 403.6 - 禁止訪問:IP 地址被拒絕
HTTP 403.7 - 禁止訪問:要求客戶證書
HTTP 403.8 - 禁止訪問:禁止站點訪問
HTTP 403.9 - 禁止訪問:鏈接的用戶過多
HTTP 403.10 - 禁止訪問:配置無效
HTTP 403.11 - 禁止訪問:密碼更改
HTTP 403.12 - 禁止訪問:映射器拒絕訪問
HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
HTTP 403.15 - 禁止訪問:客戶訪問許可過多
HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
HTTP 403.17 - 禁止訪問:客戶證書已經到期或者還沒有生效
HTTP 404.1 - 沒法找到 Web 站點
HTTP 404 - 沒法找到文件
HTTP 405 - 資源被禁止
HTTP 406 - 沒法接受
HTTP 407 - 要求代理身份驗證
HTTP 410 - 永遠不可用
HTTP 412 - 先決條件失敗
HTTP 414 - 請求 - URI 太長
5xx 服務器中出現的錯誤
500 內部錯誤 — 由於意外狀況,服務器不能完成請求。
501 未執行 — 服務器不支持請求的工具。
502 錯誤網關 — 服務器接收到來自上游服務器的無效響應。
503 沒法得到服務 — 因爲臨時過載或維護,服務器沒法處理請求。
HTTP 500 - 內部服務器錯誤
HTTP 500.100 - 內部服務器錯誤 - ASP 錯誤
HTTP 500-11 服務器關閉
HTTP 500-12 應用程序從新啓動
HTTP 500-13 - 服務器太忙
HTTP 500-14 - 應用程序無效
HTTP 500-15 - 不容許請求 global.asa
Error 501 - 未實現
HTTP 502 - 網關錯誤
常見狀態碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
客戶端發送一個HTTP請求到服務器的請求消息包括如下格式:
4.1Get請求組成
請求行(request line)、請求頭部(header)、空行和請求體(數據)四個部分組成。
請求行解析:
method 表示請求方式
path-to-resource-http 表示請求的資源地址
version-number 表示http的協議版本號
(注意:當使用get方式提交時,請求體body是空的!!!)
看一個get請求的實例,咱們訪問博客園首頁http://www.cnblogs.com/fighter007 使用fiddler抓包分析
在看一個post請求實例,咱們登錄博客園界面:https://passport.cnblogs.com/user/signin 使用fiddler抓包分析
發送post請求時,請求體是有數據的這一點和get請求區分開!
Response消息的結構和request結構基本一致。一樣也分爲三個部分,第一部分叫Response line, 第二部分叫Response header,第三部分是空行,第四部分是body。header和body之間也有個空行, 結構以下圖:
發送一個get請求的實例,查看該請求返回的響應信息。咱們訪問博客園首頁http://www.cnblogs.com/fighter007 使用fiddler抓包分析
6.1 Cache 頭域If-Modified-Since做用: 把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。若是時間一致,那麼返回304,客戶端就直接使用本地緩存文件。若是時間不一致,就會返回200和新的文件內容。客戶端接到以後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中.
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-Match
做用: If-None-Match和ETag一塊兒工做,工做原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。若是服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。不然將返回200狀態和新的資源和Etag. 使用這樣的機制將提升網站的性能
例如: If-None-Match: "03f2b33c0bfcc1:0"
實例以下圖
Cache-Control
做用: 這個是很是重要的規則。 這個用來指定Response-Request遵循的緩存機制。
Client頭域
Accept
做用:瀏覽器端能夠接受的媒體類型,
例如:Accept: text/html 表明瀏覽器能夠接受服務器回發的類型爲 text/html 也就是咱們常說的html文檔,若是服務器沒法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)通配符 * 表明任意類型。例如 Accept: */* 表明瀏覽器能夠處理全部類型,(通常瀏覽器發給服務器都是發這個)
Accept-Encoding:
做用: 瀏覽器申明本身接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate),(注意:這不是字符編碼);
例如: Accept-Encoding: gzip, deflate
Accept-Language
做用: 瀏覽器申明本身接收的語言。 語言跟字符集的區別:中文是語言,中文有多種字符集,好比big5,gb2312,gbk等等;
例如: Accept-Language: en-us
User-Agent
做用:告訴HTTP服務器,客戶端使用的操做系統和瀏覽器的名稱和版本.
咱們上網登錄論壇的時候,每每會看到一些歡迎信息,其中列出了你的操做系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這每每讓不少人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Cookie/Login 頭域
Cookie:做用最重要的header, 將cookie的值發送給HTTP 服務器
x-requested-with XMLHttpRequest //代表是AJax異步
什麼是異步請求?
當瀏覽器向服務器發送同步請求時,服務處理同步請求的過程當中,瀏覽器會處於等待的狀態,服務器處理完請求把數據響應給瀏覽器並覆蓋瀏覽器內存中原有的數據,瀏覽器從新加載頁面並展現服務器響應的數據。那麼,有沒有一種技術,可讓瀏覽器發送請求給服務器,服務器處理請求的過程當中,瀏覽器不處於等待的狀態,而且瀏覽器接收響應數據的同時再也不從新加載整個頁面,既請求發送以前的數據不丟失,又能實現頁面的局部刷新呢?那就要用到ajax請求——異步請求模型。更多訪問:什麼是異步請求ajax?
Date
做用: 生成消息的具體時間和日期
例如: Date: Sat, 11 Feb 2012 11:35:14 GMT
Cache-Control:Public 能夠被任何緩存所緩存
Cache-Control:Private 內容只緩存到私有緩存中
Cache-Control:no-cache 全部內容都不會被緩存
"public" 指令表示該響應能夠被任何中間人(譯者注:好比中間代理、CDN等)緩存。若指定了"public",則一些一般不被中間人緩存的頁面(譯者注:由於默認是private)(好比 帶有HTTP驗證信息(賬號密碼)的頁面 或 某些特定影響狀態碼的頁面),將會被其緩存。而 "private" 則表示該響應是專用於某單個用戶的,中間人不能緩存此響應,該響應只能應用於瀏覽器私有緩存中。
Expires
做用: 瀏覽器會在指定過時時間內使用本地緩存
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Vary
做用:
例如: Vary: Accept-Encoding Accept-Encoding: //默認是identity
Set-Cookie
做用:很是重要的header, 用於把cookie 發送到客戶端瀏覽器, 每個寫入cookie都會生成一個Set-Cookie.
HTTP Cookie(也叫Web Cookie或瀏覽器Cookie)是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶併發送到服務器上。一般,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登陸狀態
Set-Cookie響應頭部
和Cookie請求頭部
服務器使用Set-Cookie
響應頭部向用戶代理(通常是瀏覽器)發送Cookie信息。一個簡單的Cookie可能像這樣:
Set-Cookie: <cookie名>=<cookie值>
服務器經過該頭部告知客戶端保存Cookie信息。
Entity(實體)頭域
Content-Length
做用:發送給HTTP服務器數據的長度。
例如:Content-Length: 46295
Content-Type(內容類型)
做用:Content-Type
做用:WEB服務器告訴瀏覽器本身響應的對象的類型和字符集
Content-Type
實體頭部用於指示資源的MIME類型 media type 。
在響應中,Content-Type標頭告訴客戶端實際返回的內容的內容類型。瀏覽器會在某些狀況下進行MIME嗅探,並不必定遵循此標題的值; 爲了防止這種行爲,能夠將標題 X-Content-Type-Options
設置爲 nosniff。
Content-Encoding
Content-Encoding
是一個實體消息首部,用於對特定媒體類型的數據進行壓縮。當這個首部出現的時候,它的值表示消息主體進行了何種方式的內容編碼轉換。這個消息首部用來告知客戶端應該怎樣解碼才能獲取在 Content-Type
中標示的媒體類型內容。
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Language
Content-Language
是一個 entity header (實體消息首部),用來講明訪問者但願採用的語言或語言組合,這樣的話用戶就能夠根據本身偏好的語言來定製不一樣的內容。是一個 entity header (實體消息首部),用來講明訪問者但願採用的語言或語言組合,這樣的話用戶就能夠根據本身偏好的語言來定製不一樣的內容。
Miscellaneous 頭域
Referer
做用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪一個連接過來的,好比從我主頁上連接到一個朋友那裏,他的服務器就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。
Referrer是header的一部分,當瀏覽器向web服務器發出請求的時候,通常會帶上Referer,告訴服務器用戶從那個頁面鏈接過來的,服務器藉此能夠得到一些信息用於處理。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
X-AspNet-Version、X-Powered-By、Server:
做用:指明HTTP服務器的軟件信息
例如:x-aspnetmvc=version:5.2
X-AspNet-Version:
做用:若是網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本
例如: X-AspNet-Version: 4.0.30319
X-Powered-By:
做用:表示網站是用什麼技術開發的
例如: X-Powered-By: ASP.NET
Transport 頭域
Connection
Connection 頭(header) 決定當前的事務完成後,是否會關閉網絡鏈接。若是該值是「keep-alive」,網絡鏈接就是持久的,不會關閉,使得對同一個服務器的請求能夠繼續在該鏈接上完成。
close
代表客戶端或服務器想要關閉該網絡鏈接
1.1GET,,/books/?sex=man&name=Profing essional阿三 HTTinP/
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
注意最後一行是空行
1.1POST / HTTP/
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
GET提交:請求的數據會附在URL以後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,多個參數用&鏈接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。若是數據是英文字母/數字,原樣發送,若是是空格,轉換爲+,若是是中文/其餘字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以16進製表示的ASCII。
POST提交:把提交的數據放置在是HTTP包的包體中。上文示例中紅色字體標明的就是實際的傳輸數據
所以,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變。
首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。而在實際開發中存在的限制主要有:
GET:特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系 統的支持。所以對於GET提交時,傳輸數據就會受到URL長度的 限制。
POST:因爲不是經過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。
POST的安全性要比GET的安全性高。好比:經過GET提交數據,用戶名和密碼將明文出如今URL上,由於(1)登陸頁面有可能被瀏覽器緩存;(2)其餘人查看瀏覽器的歷史紀錄,那麼別人就能夠拿到你的帳號和密碼了,除此以外,使用GET提交數據還可能會形成Cross-site request forgery攻擊。
(1)get:請求參數是做爲一個key/value對的序列(查詢字符串)附加到URL上的
查詢字符串的長度受到web瀏覽器和web服務器的限制(如IE最多支持2048個字符),不適合傳輸大型數據集同時,它很不安全
(2)post:請求參數是在http標題的一個不一樣部分(名爲entity body)傳輸的,這一部分用來傳輸表單信息,所以必須將Content-type設置爲:application/x-www-form- urlencoded。post設計用來支持web窗體上的用戶字段,其參數也是做爲key/value對傳輸。
可是:它不支持複雜數據類型,由於post沒有定義傳輸數據結構的語義和規則。
(3)soap:是http post的一個專用版本,遵循一種特殊的xml消息格式
Content-type設置爲: text/xml 任何數據均可以xml化。
Http協議定義了不少與服務器交互的方法,最基本的有4種,分別是 GET,POST,PUT,DELETE. 一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操做。 咱們最多見的就是GET和POST了。GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息.
1.GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
2.GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
3..GET方式提交數據,會帶來安全問題,好比一個登陸頁面,經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼.