python/http協議
http協議 :
http就是一個通信規矩,通信規矩規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式。其實我們要學習的就是這個倆個格式!客戶端發送給服務器的格式加‘請求協議‘;服務端發送給客戶端的格式叫‘響應協議’
http特點:
http的特點:
全稱是超文本傳輸協議,基於請求/響應模式
http是無狀態協議。
無狀態就是,你多次訪問,第一次訪問和第二次訪問沒有任何關系
url:統一資源定位符,就是一個網址:協議名://域名:端口/路徑。例如:http://www.baidu.com:80/index.html
請求協議格式:
1 請求首行; // 請求方式 請求路徑 協議和版本,例如:GET /index.html HTTP/1.1 2 請求頭信息;// 請求頭名稱:請求頭內容,即為key:value格式,例如:Host:localhost 3 空行; // 用來與請求體分隔開 4 請求體。 // GET沒有請求體,只有POST有請求體。
客戶端(瀏覽器)向服務端(server)發送協議(server查看)
1 1、請求首行 (GET請求方式,直接把數據暴露在url后面) GET/數據內容,http協議版本 2 GET /favicon.ico HTTP/1.1 3 2、請求頭信息 4 Host: 127.0.0.1:8800 #訪問的IP和端口 5 Connection: keep-alive 6 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) 7 Accept: image/webp,image/*,*/*;q=0.8 8 Referer: http://127.0.0.1:8800/ #查看訪問鏈接和路徑(查看客戶量是通過自己鏈接還是別的地轉過來的) 9 Accept-Encoding: gzip, deflate, sdch, br 10 Accept-Language: zh-CN,zh;q=0.8 #支持的語言 11 因為http協議是無狀態的,又想結果信息保存的功能,就可以通過 12 Cookie容器訪問,Cookie是一個字典,內容是服務端返回給我們的 13 Cookie就是一個容器,也是一個字典 14 3、空行(為了讓請求解釋信息和請求數據區分開,加一個空行) 15 16 4、請求體(數據)-----------(GET請求體不存在)post會把數據放在請求體,get會把數據放在URL地址欄后邊
post比get安全系數高,get把數據放在url通過?隔開,url的長度有個限制。
post把數據放在請求體內,數據長度沒有限制
GET請求:
HTTP默認的請求方法就是GET
GET沒有請求體
數據必須在1K之內
GET請求數據會暴露在瀏覽器的地址欄中
GET請求常用的操作:
1、在瀏覽器的地址欄中字節給出URL,name就一定是GET請求
2、點擊頁面上超鏈接也一定是GET請求
3、提交表單時,表單默認使用GET請求,但可以設置為POST
1 GET 127.0.0.1:8090/login HTTP/1.1:GET請求,請求服務器路徑為 127.0.0.1:8090/login ,協議為1.1; 2 Host:localhost:請求的主機名為localhost; 3 *User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的; 4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:告訴服務器,當前客戶端可以接收的文檔類型,其實這里包含了*/*,就表示什么都可以接收; 5 Accept-Language: zh-cn,zh;q=0.5:當前客戶端支持的語言,可以在瀏覽器的工具選項中找到語言相關信息; 6 Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮后再發送; 7 Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客戶端支持的編碼; 8 Connection: keep-alive:客戶端支持的鏈接方式,保持一段時間鏈接,默認為3000ms; 9 Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因為不是第一次訪問這個地址,所以會在請求中把上一次服務器響應中發送過來的Cookie在請求中一並發送去過;這個Cookie的名字為JSESSIONID
post請求
1.數據不會出現在地址欄中
2.數據的大小沒有上限
3.有請求體
4.請求體中如果存在中文,會使用URL編碼
使用表單可以發post請求,但3表單默認是GET
post請求是可以有體的,而GET請求不有請求體
Referer:請求頭,可以查看客流量的來源
http://localhost:8080/hello/index.jsp:請求來自哪個頁面,例如你在百度上點擊鏈接到了這里,那么Referer:http://www.baidu.com;如果你是在瀏覽器的地址欄中直接輸入的地址,那么就沒有Referer這個請求頭了;
Content-Type:application/x-www-form-urlencoded:表單的數據類型,說明會使用url格式編碼數據;url編碼的數據都是以“%”為前綴,后面跟隨兩位的16進制。
Content-Length:13:請求體的長度,這里表示13個字節
keyword=hello:請求體內容!hello是在表單中輸入的數據,keyword是表單字段的名字
響應協議:
響應協議的格式如下:
響應首行
響應頭信息
空行
響應體
響應內容是由服務器發送給瀏覽器的內容,瀏覽器會根據響應內容來顯示。遇到<img src=''>會開一個新的線程加載,所以有時圖片多的話,內容會先顯示出來,然后圖片才一張一張加載出來
HTTP/1.1 200 OK:響應協議為HTTP1.1, 狀態碼為200 表示請求成功 OK是對狀態碼的解釋
Server:WSGIServer/0.2 CPython/3.5.2:服務器的版本信息;
Content-Type:text/html;charset=UTF-8:響應體使用的編碼為UTF-8;
Content-Length:724 :響應體為724字節
Set-Cookie:JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應給客戶端的Cookie
Date:Wed,25 Sep 2012 04:15:03 GMT:響應的時間,這可能會有8小時的時區差
狀態碼:
響應頭對瀏覽器來說說很重要 ,他說明了響應的真正含義。例如200表示響應成功了,302表示重定向,這說明瀏覽器需要再發一個新的請求。
200:請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中
302:重定向,當響應碼為302時,表示服務器要求瀏覽器重新再發一個請求,服務器會發送一個響應頭Location,它指定新請求的URL地址
404:請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源(只要是4開頭的錯誤都是客戶端的問題)
500:請求資源找到了,但服務器內部出現了錯誤(只要是5開頭的錯誤都是服務端的問題)
1 當用戶第一次請求index.html時,服務器會添加一個名為Last-Modified響應頭,
這個頭說明了 index.html的最后修改時間,瀏覽器會把index.html內容,以及最后響應時間緩存下來 。
當做用戶第二次請求index.e=html時,在請求中包含一個名為Tf-Modified請求頭,
它的值就是第一次請求服務器通過Last-Modified響應頭發送給瀏覽器的值,即inde.html最后的修改時間,
If-Modified-Since請求頭就是在告訴服務器,我這里瀏覽器緩存的index.html最后修改時間是這個,
您看看心在的index.html最后修改時間是不是這個,如果還是的話,那么您就不用在響應這個index.html內容了,
我會把緩沖的內容直接顯示出來。而服務器會發響應碼304,表示index.html於瀏覽器上次緩存的相同,
無需再次發送,
瀏覽器可以顯示自己的緩沖頁面,如果比對不同,那么說明index.hrml已經做了修改,服務器會響應200

其他響應頭
告訴瀏覽器不要緩存的響應頭:
-
Expires: -1;
-
Cache-Control: no-cache;
-
Pragma: no-cache;
自動刷新響應頭,瀏覽器會在3秒之后請求http://www.baidu.com:
-
Refresh: 3;url=http://www.baidu.com HTML中指定響應頭
在HTMl頁面中可以使用<meta http-equiv="" content="">來指定響應頭,例如在index.html頁面中給出<meta http-equiv="Refresh" content="3;url=http://www.baidu.com">,表示瀏覽器只會顯示index.html頁面3秒,然后自動跳轉到http://www.baidu.com.
