HTTP詳解--Http請求(四)
HTTP報文
1.用於HTTP協議互動的資訊被稱為HTTP報文。請求端(客戶端)的HTTP報文叫做請求報文,響應端(伺服器端)的叫做響應報文。HTTP報文字身是由多行(用CR+LF作換行符)資料構成的字串文字;
一.瀏覽器的http請求都發送了什麼?
1.說明:一個完整的HTTP請求包括如下內容:
一個請求行、若干請求頭、以及實體內容,其中的一些訊息頭和實體內容都是可選的,訊息頭和實體內容之間要用空行隔開。
2.報文結構如下圖。重要的是報文首部和報文的主體部分,中間的部分主要是要來分割首部和主體的。報文主體並不一定非要出現。
3.請求報文結構
4.一個請求示例
二.請求行詳解
1.GET /day09/hello HTTP/1.1
(1).HTTP1.0和HTTP1.1的區別:
1)在HTTP1.0協議中,客戶端與web伺服器建立連線後,只能獲得一個web資源。
2)HTTP1.1協議,允許客戶端與web伺服器建立連線後,在一個連線上獲取多個web資源。(常用)
2.請求方式(get與post):
(1)常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE
(2)常用的請求方式: GET 和 POST
(3)GET和POST的區別:
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.作為開發人員,一定要明白報文是可以偽造的這一點!