1. 程式人生 > >HTTP詳解--Http請求(四)

HTTP詳解--Http請求(四)

HTTP報文

1.用於HTTP協議互動的資訊被稱為HTTP報文。請求端(客戶端)的HTTP報文叫做請求報文,響應端(伺服器端)的叫做響應報文。HTTP報文字身是由多行(用CR+LF作換行符)資料構成的字串文字;

一.瀏覽器的http請求都發送了什麼?

1.說明:一個完整的HTTP請求包括如下內容:

一個請求行、若干請求頭、以及實體內容,其中的一些訊息頭和實體內容都是可選的,訊息頭和實體內容之間要用空行隔開。

2.報文結構如下圖。重要的是報文首部和報文的主體部分,中間的部分主要是要來分割首部和主體的。報文主體並不一定非要出現。

3.請求報文結構

4.一個請求示例

二.請求行詳解

1.GET /day09/hello HTTP/1.1

:表示向伺服器用GET方式請求day09/hello,使用HTTP:/1.1協議,這是傳送請求時,必須要有的;

(1).HTTP1.0和HTTP1.1的區別:

1)在HTTP1.0協議中,客戶端與web伺服器建立連線後,只能獲得一個web資源。

2)HTTP1.1協議,允許客戶端與web伺服器建立連線後,在一個連線上獲取多個web資源。(常用)

2.請求方式(getpost)

(1)常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE

(2)常用的請求方式: GET 和 POST        

(3)GETPOST的區別:

1)傳輸特點:

Get(預設值):是通過URL傳遞表單值,引數會放在報文頭中;

Post:傳遞的引數值是隱藏到http報文體中,URL中看不到。在瀏覽器端每次重新整理頁面,伺服器都會提示瀏覽器要重新傳輸請求。

另外,只有POST提交的引數會放到實體內容中

2)區別是什麼?

1)get是通過位址列(URI)會跟上引數資料。以?開頭,多個引數之間以&分割。而post通過位址列看不到引數值,適合傳遞密碼;

2)get傳遞的資料量是有限的,不超過1KB,如果要傳遞大資料量不能用Get。而post則沒有這個限制

3)get瀏覽器可能會快取,post一定不會快取

3)如何通過外在表象判斷兩者?

只要在位址列中輸入一個網址回車能訪問,那麼就是GET

4)如果Get和Post兩者的請求一致?

那麼直接在doGet方法中,新增處理程式碼。之後在doPost方法中,使用this.doGet()呼叫相同的處理方式即可。

總之,兩者公用一段程式碼即可

注意:

重寫doGet或者doPost的時候,不要保留super.doGet()或者super.doPost()。這兩個方法會丟擲一個異常。

3.請求資源

URL: 統一資源定位符。http://localhost:8080/day09/testImg.html。只能定位網際網路資源。是URI的子集。

URI: 統一資源標記符。/day09/hello。用於標記任何資源。可以是本地檔案系統,區域網的資源(//192.168.14.10/myweb/index.html),可以是網際網路。

三.請求頭詳解(Request Headers部分)

說明:請求頭中的引數不一定每次請求都存在

Accept: text/html,image/*

瀏覽器接受的資料型別

Accept-Charset: ISO-8859-1

瀏覽器接受的編碼格式

Accept-Encoding: gzip,compress

瀏覽器接受的資料壓縮格式

Accept-Language: en-us,zh

瀏覽器接受的語言

Host: www. bing.org:80

(必須的)當前請求訪問的目標地址(主機:埠)

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT

瀏覽器最後的快取時間

Referer: http: //www.bing.org/index.jsp

當前請求來自於哪裡

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)

瀏覽器型別

Cookie:name=eric

瀏覽器儲存的cookie資訊

Connection: close/Keep-Alive

瀏覽器跟伺服器連線狀態。close: 連線關閉 keep-alive:儲存連線。

Date: Tue, 11 Jul 2000 18:23:51 GMT

請求發出的時間

四.範圍請求

1.作用:當我們下載尺寸稍大的圖片或檔案時,如果出現網路中斷,可以通過該技術從之前的下載中斷處恢復下載;(也就是所謂的"斷點續傳"功能)

1.1 該功能的實現,需要指定下載的實體範圍;

2.Range

(1)執行範圍請求需要首欄位Range來指定byte範圍。Range欄位可以通過三種格式設定要傳輸的位元組範圍:

(2)例,web伺服器有一個資源,比如是a.txt,內容為:

(3)示例程式碼:

public class RangeDemo {

        public static void main(String[] args) throws Exception {

                URL url = new URL("http://localhost:8080/day04/a.txt");

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setRequestProperty("Range", "bytes=5-");

                InputStream in = conn.getInputStream();

                int len = 0;

                byte[] buffer = new byte[1024];

                FileOutputStream out = new FileOutputStream("c:\\a.txt", true);

                while((len=in.read(buffer)) != -1) {

                        out.write(buffer, 0, len);

                }

                in.close();

                out.close();

        }

}

//執行以上程式,該使用者就下載完剩下的資料了。

五.內容協商返回最合適的內容

1.同一個網站可能存在多份相同內容的頁面。比如英文版或者中文版的Web頁面。

2.當瀏覽器的預設語言為英文或者中文,訪問相同的URI的Web頁面時,則會顯示對應的英文版或中文版的Web頁面,這樣的機制被稱為"內容協商";

3."內容協商"會以響應資源的語言,字符集,編碼方法等作為判斷的基準;

4."內容協商"技術有以下3種類型:

4.1伺服器驅動協商:由伺服器端進行內容協商。以請求的首部欄位為參考,在伺服器端自動處理。但對使用者來說,以瀏覽器傳送的資訊作為判定的依據,並不一定能篩選出最優內容;

4.2客戶端驅動協商:由客戶端進行內容協商的方式。使用者從瀏覽器顯示的可選項列表中手動選擇。還可以利用JavaScript指令碼在Web頁面上自動進行上述選擇。

4.3透明協商:是伺服器驅動和客戶端驅動的結合體,是由伺服器端和客戶端各自進行內容協商的一種方法;

六.偽造報文?

1.因為上面的資訊都是瀏覽器傳送給伺服器的,所以完全可以通過修改瀏覽器的報文來發送假的報文給伺服器。

2.作為開發人員,一定要明白報文是可以偽造的這一點!