HTTP請求方法 原

一、HTTP請求方法:Http協議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE

一個URL地址用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着這個資源的查,改,增,刪4個操作。我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息

1.GET-最常見的一種請求方式

當客戶端要從服務器中讀取文檔時,當點擊網頁上的鏈接或者通過在瀏覽器的地址欄輸入網址來瀏覽網頁的,使用的都是GET方式。GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。

使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問號("?")代表URL的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=1008&op=bind,這樣通過GET方式傳遞的參數直接表示在地址中,以用google搜索domety爲例,Request報文如下:

GET/search?hl=zh-CN&source=hp&q=domety&aq=f&oq-HTTP/1.1

Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,application/x-silverlight,application/x-shockwave-flash,

Referer:<a href="http://www.google.cn/">http://www.google.cn</a>

Accept-Language:zh-cn

Accept-Encoding:gzip,deflate

User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1;.NET CLR 2.0,50727;TheWorld)

Host:<a href="http://www.google.cn">www.google.cn</a>

Connection:Keep-Alive

Cookie:PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=0jj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm81ZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUoRnHcJU37Y-FxlRugatx63JLv7CWMD6UB_O_r

可以看到,GET方式的請求一般不包含"請求內容"部分,請求數據以地址的形式表現在請求行,地址鏈接如下:<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?zl=zh-CN&source=hp&q=domety&aq=f&oq=</a>

地址中"?"之後的部分就是通過GET發送的請求數據,在地址欄中可以看到,各個數據之間用"&"符號隔開。很顯然,這種方式不適合傳送私密數據。

另外,由於不同的瀏覽器對地址的字符限制也有所不同,一般最多隻能識別1024個字符,所以如果需要傳送大量數據的時候,也不適合使用GET方式。

2。POST

對於上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因爲使用POST方法可以允許客戶端給服務器提供信息較多。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現 ,可以傳輸大量數據,這樣POST方式對傳送的數據大小沒有限制,而且也不會顯示在URL中。還以上面的搜索domety爲例,如果使用POST方式的話,格式如下:

POST /search HTTP/1.1 
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */* 
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> 
Accept-Language: zh-cn 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) 
Host: <a href="http://www.google.cn">www.google.cn</a> 
Connection: Keep-Alive 
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r

hl=zh-CN&source=hp&q=domety

可以看到,POST方式請求行中不包含數據字符串,這些數據保存在"請求內容"部分,各數據之間也是使用"&'符號隔開

POST方式大多用於頁面的表單中。因爲POST也能完成GET的功能,因此多數人在設計表單的時候一律都使用POST方式,這其實是一個誤區。GET方式也有自己的特點和優勢,我們應該根據不同的情況來選擇是使用GET還是使用POST

3.HEAD

HEAD就像GET,只不過服務端接受到HEAD請求後只返回響應頭,而不會發送響應內容。當我們只需要查看某個頁面的狀態的時候,使用HEAD是非常高效的,因爲在傳輸的過程中省去了頁面內容

4.GET和POST方法的區別

我們看看GET和POST的區別

1.GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456.POST方法是把提交的數據放在HTTP包的Body中

2.GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制

3.GET方式需要使用Request.QueryString來取得的變量的值,而POST方法提交的數據沒有限制

4.GET方法提交數據,會帶來安全問題,比如一個登錄 頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器 ,就可以從歷史記錄獲得該用戶的賬號和密碼。

二、請求的header

使用Fiddler 能很方便的查看Reques header, 點擊Inspectors tab ->Request tab-> headers  如下圖所示.

header 有很多,比較難以記憶,我們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。

1、Cache 頭域

1.1、If-Modified-Since

作用: 把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。如果時間一致,那麼返回304,客戶端就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中.

例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

實例如下圖

 

1.2、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"

實例如下圖

1.3、Pragma

作用: 防止頁面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣

Pargma只有一個用法, 例如: Pragma: no-cache

注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control

1.4、Cache-Control

作用: 這個是非常重要的規則。 這個用來指定Response-Request遵循的緩存機制。各個指令含義如下

Cache-Control:Public   可以被任何緩存所緩存()

Cache-Control:Private     內容只緩存到私有緩存中

Cache-Control:no-cache  所有內容都不會被緩存

還有其他的一些用法, 我沒搞懂其中的意思, 請大家參考其他的資料 

2、Client 頭域

2.1、Accept

作用: 瀏覽器端可以接受的媒體類型,

例如:  Accept: text/html  代表瀏覽器可以接受服務器回發的類型爲 text/html  也就是我們常說的html文檔,

如果服務器無法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)

通配符 * 代表任意類型

例如  Accept: */*  代表瀏覽器可以處理所有類型,(一般瀏覽器發給服務器都是發這個)

2.2、Accept-Encoding:

作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate),(注意:這不是隻字符編碼);

例如: Accept-Encoding: gzip, deflate

2.3、Accept-Language

作用: 瀏覽器申明自己接收的語言。 

語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;

例如: Accept-Language: en-us

2.4、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)

2.5、Accept-Charset

作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字符編碼方案);

例如:

3、Cookie/Login 頭域

3.1、Cookie:

作用: 最重要的header, 將cookie的值發送給HTTP 服務器

4、Entity頭域

4.1、Content-Length

作用:發送給HTTP服務器數據的長度。

例如: Content-Length: 38 

4.2、Content-Type

作用:

例如:Content-Type: application/x-www-form-urlencoded 

5、Miscellaneous 頭域

5.1、Referer:

作用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鍊接到一個朋友那裏,他的服務器就能夠從HTTP Referer中統計出每天有多少用戶點擊我主頁上的鏈接訪問他的網站。

例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

6、Transport 頭域

6.1、Connection

例如: Connection: keep-alive   當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

例如:  Connection: close  代表一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

6.2、Host(發送請求時,該報頭域是必需的)

作用: 請求報頭域主要用於指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的

例如: 我們在瀏覽器中輸入:http://www.guet.edu.cn/index.html

瀏覽器發送的請求消息中,就會包含Host請求報頭域,如下:

Host:http://www.guet.edu.cn

此處使用缺省端口號80,若指定了端口號,則變成:Host:指定端口號

三、響應的狀態碼

1、什麼是response的狀態碼?

Response 消息中的第一行叫做狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。

狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.

HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別

1XX  提示信息 - 表示請求已被成功接收,繼續處理

2XX  成功 - 表示請求已被成功接收,理解,接受

3XX  重定向 - 要完成請求必須進行更進一步的處理

4XX  客戶端錯誤 -  請求有語法錯誤或請求無法實現

5XX  服務器端錯誤 -   服務器未能實現合法的請求 

2、一些常見的狀態碼

2.1、200 OK

最常見的就是成功響應狀態碼200了, 這表明該請求被成功地完成,所請求的資源發送回客戶端

如下圖, 打開博客園首頁

2.2、302 Found

重定向,新的URL會在response 中的Location中返回,瀏覽器將會自動使用新的URL發出新的Request

例如在IE中輸入, http://www.google.com. HTTP服務器會返回302, IE取到Response中Location header的新URL, 又重新發送了一個Request.

2.3、304 Not Modified

代表上次的文檔已經被緩存了, 還可以繼續使用,

例如打開博客園首頁, 發現很多Response 的status code 都是304

提示: 如果你不想使用本地緩存可以用Ctrl+F5 強制刷新頁面

2.4、400 Bad Request  客戶端請求與語法錯誤,不能被服務器所理解

2.5、403 Forbidden 服務器收到請求,但是拒絕提供服務

2.6、404 Not Found

請求資源不存在(輸錯了URL)

比如在IE中輸入一個錯誤的URL, http://www.cnblogs.com/tesdf.aspx

 

2.7、500 Internal Server Error 服務器發生了不可預期的錯誤

2.8、503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間後可能恢復正常 

四、響應的header

同樣使用Fiddler 查看Response header, 點擊Inspectors tab ->Response tab-> headers  如下圖所示

 我們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。

1、Cache頭域

1.1、Date

作用:  生成消息的具體時間和日期

例如: Date: Sat, 11 Feb 2012 11:35:14 GMT 

1.2、Expires

作用: 瀏覽器會在指定過期時間內使用本地緩存

例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT 

1.3、Vary

作用:

例如: Vary: Accept-Encoding 

2、Cookie/Login 頭域

2.1、P3P

作用: 用於跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題

例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

2.2、Set-Cookie

作用: 非常重要的header, 用於把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.

例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

 

3、Entity頭域

3.1、ETag

作用:  和If-None-Match 配合使用。 (實例請看上節中If-None-Match的實例)

例如: ETag: "03f2b33c0bfcc1:0"

3.2、Last-Modified:

作用: 用於指示資源的最後修改日期和時間。(實例請看上節的If-Modified-Since的實例)

例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT 

3.3、Content-Type

作用:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集,

例如:

Content-Type: text/html; charset=utf-8

Content-Type:text/html;charset=GB2312

Content-Type: image/jpeg 

3.4、Content-Length

指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程中,Content-Length的方式要預先在服務器中緩存所有數據,然後所有數據再一股腦兒地發給客戶端。

例如: Content-Length: 19847 

3.5、Content-Encoding

WEB服務器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。

例如:Content-Encoding:gzip 

3.6、Content-Language

作用: WEB服務器告訴瀏覽器自己響應的對象的語言者

例如: Content-Language:da 

4、Miscellaneous 頭域

4.1、Server:

作用:指明HTTP服務器的軟件信息

例如:Server: Microsoft-IIS/7.5 

4.2、X-AspNet-Version:

作用:如果網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本

例如: X-AspNet-Version: 4.0.30319

4.3、X-Powered-By:

作用:表示網站是用什麼技術開發的

例如: X-Powered-By: ASP.NET

5、Transport頭域

5.1、Connection

例如: Connection: keep-alive   當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

例如:  Connection: close  代表一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

6、Location頭域

6.1、Location

作用: 用於重定向一個新的位置, 包含新的URL地址

原文地址:https://www.cnblogs.com/lexiaofei/p/6943690.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章