HTTP系列--報文結構

其他網址

請求報文結構介紹 - 基礎 - HTTP1.1協議常識 - KK的小故事

請求報文結構

post:

get

情況1:

情況2:

get和post區別

另見:《JSP&Servlet學習筆記》

比較方面

get

post

作用

獲得服務器指定的資源

發佈信息給服務器

參數位置

請求行或者請求體

(參數長度無限制,若參數在請求行會出現在地址欄)

請求體

(參數長度無限制、不會出現在地址欄)

瀏覽器回退

不會重新提交請求

會重新提交請求

是否等冪操作

是等冪操作

不一定是等冪操作  

GET和POST的區別和應用?

        這問題挺複雜。簡而言之,就是“安全”和“不安全”的區別。什麼是安全?不用承擔責任。什麼是不安全?可能需要承擔責任。舉個例子,點擊某個鏈接以同意某個協議,這個請求明顯就是不安全的,因爲需要承擔責任。如果採用GET,就違反了GET應該用於安全請求的規範。因爲瀏覽器可能在你不知情的情況下預加載這個頁面(因爲是“安全”的GET請求),這樣相當於你在不知情的情況下同意了某個協議,這顯然是我們不希望看到的。在契約式的設計裏,違反契約的行爲是會帶來嚴重的後果的。瀏覽器按照契約預加載了安全的GET請求,但這本身是不安全的,帶來的後果自然要由打破契約的人承擔(將這個請求設計成GET的人出來捱打)。

        之所以強調“安全”,而不是按照常規的說法強調副作用,因爲有副作用的請求不代表不安全;舉例來說,服務器有一個顯示訪問人數的功能,這個功能就可以用GET來做。雖然每次訪問都會發送改變服務器狀態(計數器)的請求,但用戶不會因爲這個請求承擔責任,這個請求是安全的。至於什麼GET請求的URL有長度限制(後來事實證明其實沒有),什麼GET請求的URL裏不能有中文(或者說非ASCII吧),都只是實現上的區別;從最初的設計上來說區別並不在這裏。

        當然,這些都是純粹的理論層面的東西。如果遵守RESTful的規範,採用語義化的GET/POST請求,自然也就不會有這些問題了。因爲通常來說,查詢是安全的;這也是GET的主要作用。

HTTP請求行

簡介

第一行GET http://www.kkh86.com/http-test.do HTTP/1.1就叫做請求行,這行內容又分爲以下三個元素

  1. 請求方法

    前面第一個詞表示了本次HTTP請求的方法(GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT)

  2. 請求地址

    這個請求地址是帶有host的,就算HTML裏只寫了“href="/http-test.do"”,但瀏覽器會自動跟當前網頁的域名拼接成完整的地址構成這個HTTP請求信息,比如“http://www.kkh86.com/http-test.do”

    在非瀏覽器的請求場景中,比如通過PHP的curl函數發起請求,又或是Java、C#等代碼,都必須寫入完整網址,不然你只寫相對路徑的話人家怎麼知道往哪個host發送請求呢

  3. 協議版本

    HTTP1.1表示本次通訊數據格式的書寫排版是遵循HTTP的1.1版本協議的,HTTP最初的版本是1.0,但沒多久就升級爲1.1了,至少目前我還沒見過哪個軟件還使用1.0版本協議來通訊。

    我雖然看過幾次1.1和1.0的具體區別,但其實多年來發現知道這些區別對我們日常開發來說沒任何作用,而最後我也背不出來,建議你不要去關心這些版本區別吧,因爲我可以說的就是當今能在我們各種系統中使用的瀏覽器都使用1.1版本與服務器通訊,你學了1.0的東西也不知往哪用。

    這個版本可以說是萬年不變的,1.0因爲某些缺陷被廢棄了,1.1正在流行,無論你用什麼抓包、瀏覽器抓包都是看到這個版本號,會看膩的。

    在未來5~10年等HTTP2.0版本普及後就能在抓包過程中發現1.1和2.0兩個版本號了

請求體

get是否包含body?

http規範:對get和post都沒有body限制和URI長度限制(即可以一樣用);但規定了get用於獲取資源,post用於添加。
html規範:規定了get不能帶有body。如果請求不是用html發送,當然可以包含body。

        GET 請求能包含 body 但最好不要這麼做。標準沒有禁止,但也沒有定義語義。老版本的postman是不支持在GET請求里加body的,新版本的postman則支持,如下圖所示(版本爲v7.27.1)

不建議get帶body的原因

  1. 就算服務器不會忽略 GET 請求的body,各種代理和緩存可能也會過濾body。
  2. GET 被設計來用 URI 來識別資源,若請求體中帶數據,那麼通常的緩存服務便失效了,URI 不能作爲緩存的 Key。

正常操作

如果在瀏覽器裏用form標籤加submit按鈕提交的話,瀏覽器會自動將參數組裝成UrlEncode格式,包括在jquery裏如果這樣傳入一個key value對象也會自動轉換成UrlEncode,最後會變成name=Jay&age=11放到請求體裏面 :

$.post('/xx.do', {
	name : 'Jay',
	age : 11
});

$.ajax({
	url : '/xx.do',
	data : {
		name : 'Jay',
		age : 11
	}
});

自定義請求體

要自定義格式的話只能通過ajax請求來發送:

$.ajax({
	url : '/xx.do',
	data : JSON.stringify({
		name : 'Jay',
		age : 11
	})
});

這樣構造的請求報文大概如下(主要是最後一行,請求體不是UrlEncode而是JSON):

OST http://kk/xx.do HTTP/1.1
Host: kk
Connection: keep-alive
Content-Length: 23
Pragma: no-cache
Cache-Control: no-cache
Origin: http://kk
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3368.400 QQBrowser/9.6.11974.400
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
Referer: http://kk/it/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8

{"name":"Jay","age":11}

請求頭字段

其他網址

HTTP協議常用頭部實例詳解(Request、Response)_面試_selinda001的博客-CSDN博客

可以追加自定義請求頭 。見:ajax自定義header - 少用但偶爾會碰到 - 前端進階 - KK的小故事

Accept:text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */*; q=0.8

  • 作用:向服務器申明客戶端(瀏覽器)可以接受的媒體類型(MIME)的資源
  • 解釋:瀏覽器可以接受 text/html、application/xhtml+xml、application/xml類型,通配符*/* 表示任意類型的數據。並且瀏覽器按照該順序進行接收。( text/html —> application/xhtml+xml —> application/xml)

Accept-encoding: gzip, deflate, br

  • 作用:向服務器申明客戶端(瀏覽器)接收的編碼方法,通常爲壓縮方法
  • 解釋:瀏覽器支持採用經過 gzip,deflate 或 br 壓縮過的資源

Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7

  • 作用:向服務器申明客戶端(瀏覽器)接收的語言
  • 解釋:瀏覽器能夠接受 en-US, en 和 zh-CN 三種語言,其中 en-US 的權重最高 ( q 最高爲1,最低爲 0),服務器優先返回 en-US 語言
  • 延伸:語言與字符集的區別:zh-CN 爲漢語,漢語中有許多的編碼:gbk2312 等

Cache-control: max-age=0

  • 作用:控制瀏覽器的緩存,常見值爲 private、no-cache、max-age、alidate,默認爲 private,根據瀏覽器查看頁面不同的方式來進行區別
  • 解釋:瀏覽器在訪問了該頁面後,不再會訪問服務器

Cookie:

  • 作用:告訴服務器關於 Session 的信息,存儲讓服務器辨識用戶身份的信息。

Refer:https://www.baidu.com/xxxxxxxxxx

  • 作用:告訴服務器該頁面從哪個頁面鏈接的
  • 解釋:該頁面從 https://www.baidu.com 中的搜索結果中點擊過來的

Upgrade-insecure-requests:1

  • 作用:申明瀏覽器支持從 http 請求自動升級爲 https 請求,並且在以後發送請求的時候都使用 https
  • 解釋:當頁面中包含大量的 http 資源的時候(圖片、iframe),如果服務器發現一旦存在上述的響應頭的時候,會在加載 http 資源的時候自動替換爲 https 請求

User-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

  • 作用:向服務器發送瀏覽器的版本、系統、應用程序的信息。
  • 解釋:Chrome 瀏覽器的版本信息爲 63.0.3239.132,並將自己僞裝成 Safari,使用的是 WebKit 引擎,WebKit僞裝成 KHTML,KHTML僞裝成Gecko(僞裝是爲了接收那些爲Mozilla、safari、gecko編寫的界面)
  • 延伸:可以隨便填(但不應該隨便填)不過一般用於統計。

X-Chrome-UMA-Enabled、X-Client-Data :與 Chrome 瀏覽器相關的數據

響應頭字段

其他網址

HTTP協議常用頭部實例詳解(Request、Response)_面試_selinda001的博客-CSDN博客

Accpet-ranges:bytes

  • 作用:表明自己是否接收穫取某個實體的一部分(比如文件的一部分)
  • 解釋:接受
  • 延伸:服務器支持斷點續傳,以及同時下載文件的多個部分時,必須設置爲 bytes

Alt-svc: hq=”:443”; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=”:443”; ma=2592000; v=”41,39,38,37,35”

  • 作用:服務器使用“alt-svc”(Alternative Servicesde)標識資源,可以通過不同的網絡位置或者網絡協議進行獲取

Content-length:24211

  • 作用:HTTP消息實體的傳輸長度
  • 解釋:該實體的傳輸長度(被 br 壓縮後的長度爲)24211

Content-encoding:br

  • 作用:設置數據使用的編碼類型(壓縮類型)
  • 解釋:數據使用 br 進行壓縮後返回到瀏覽器上

Content-type:text/html; charset=UTF-8

  • 作用:設置響應體的媒體資源類型(MIME)
  • 解釋:服務器發送 html 文檔,字符集爲 UTF-8

Age:1037016

  • 作用:表明該響應從緩存中拿到時響應的壽命,代理服務器當前的系統時間與此應答消息中的通用消息頭Date的值之差
  • 解釋:該響應在緩存代理中存放了 1037016 秒

Date:Thu, 15 Feb 2018 20:31:45 GMT

  • 作用:設置響應被服務器創建的時間
  • 解釋:在 GMT(格林威治標準時間)Thu, 15 Feb 2018 20:31:45,發送的響應

Expires:Fri, 01 Feb 2019 17:33:57 GMT

  • 作用:設置響應體的過期時間。如果在過期之前進行訪問,就會讀取緩存中的版本。
  • 解釋:在 GMT(格林威治標準時間)Fri, 01 Feb 2019 17:33:57,在這個時間之前,客戶端不用再向服務器發送請求
  • 延伸:如果和 Cache-control 同時存在,那麼被其中的 max-age 覆蓋

Last-modified:Mon, 12 Dec 2016 14:45:00 GMT

  • 作用:設置該文件在服務器端中最後被修改的時間
  • 解釋:在 GMT(格林威治標準時間)Fri, 01 Feb 2019 17:33:57,該文件被服務器所修改

Vary:Accept-Encoding

  • 作用:服務器響應時根據請求頭中的的值返回不同的內容的
  • 過程:瀏覽器 —> 請求 —> squid —> 請求 —> apache
  • 解釋: 
  • apache 在 response headers 中 返回了 vary: Accept-Encoding,
  • 在 squid 中需要存儲該 encoding 的值作爲緩存 key 的值,比如,resourse_1 : gzip, resourse_2: deflate
  • 下次請求到 squid,需要先找到緩存文件的索引文件,根據不同的 accept-Encoding(gzip、deflate)的值來找相應的文件。

p3p:CP=”This is not a P3P policy! See g.co/p3phelp for more info.”

  • 作用:隱私安全平臺(the Platform for Privary Preferences),網站向瀏覽器申明自己的隱私政策。

Server: gws

  • 作用:設置服務器名稱

Set-cookie:

  • 作用:設置 http 的 Cookie

Status: 200

  • 作用:設置HTTP的響應狀態
  • 解釋:200 代表成功請求

Strict-transport-security: max-age=3600

  • 作用:HSTS 策略,告訴 HTTP 客戶端緩存 HTTPS 策略多少時間。
  • 解釋:在 3600 秒內,不管用戶在瀏覽器輸入不帶協議的網址如:google.com 時,還是http協議的網址如:http://google.com ,都會默認將請求內部跳轉到 https://google.com

X-frame-options: SAMEORIGIN

  • 作用:點擊劫持保護
  • 解釋:頁面可以在相同域名頁面的 frame中展示

X-content-type-options: nosniff

  • 作用:設置瀏覽器的”MIME”攻擊機制
  • 解釋:服務器中的內容是 image/png,那麼瀏覽器就會顯示爲 image/png

X-xss-protection:1; mode=block

  • 作用:設置瀏覽器的XSS防護機制
  • 解釋:瀏覽器如果檢測到惡意代碼,則不渲染惡意代碼

 

 

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