HTTP協議
一、http協議概述
HTTP(hypertext transport protocol),即超文本傳輸協議。這個協議詳細規定了瀏覽器和萬維網服務器之間互相通信的規則。
HTTP就是一個通信規則,通信規則規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式。其實我們要學習的就是這個兩個格式!客戶端發送給服務器的格式叫“請求協議”;服務器發送給客戶端的格式叫“響應協議”。
特點:
HTTP叫超文本傳輸協議,基於請求/響應模式
HTTP是無狀態協議。(客戶端和服務器端並不會保存網頁狀態,用戶打開一個服務器上的網頁和之前打開的網頁之間是沒有任何聯系的,所以才出現了cookie和session。它們就是為了保存客戶端和用戶狀態的技術。)
HTTP是基於TCP/IP通信協議來傳遞數據
HTTP協議通常承載於TCP協議之上,有時有承載與TLS或SSL協議層之上,這時候就是HTTPS。
5、HTTP默認的端口號為80,HTTPS默認的端口號為443。
-
URL是什么?
統一資源定位符,就是一個網址。
-
URL格式是什么?
協議名://域名:端口/路徑
二、http請求報文
請求報文的格式如下:
請求首行 // 請求方式 請求路徑(URI) 協議和版本,例如:GET /index.html HTTP/1.1
請求頭信息 // 請求頭名稱:請求頭內容,即為key:value格式,例如:Host:localhost
空行 // 用來與請求體分隔開
請求實體 // GET沒有請求體,只有POST有請求體。
請求首行內容:
方法:
GET 獲取資源
POST向服務器端發送數據,傳輸實體主體
PUT 傳輸文件
HEAD獲取報文首部
DELETE 刪除文件
OPTIONS 詢問支持的方法
TRACE 追蹤路徑
URI:
協議/版本號:
HTTP/1.0
HTTP/1.1
HTTP/2
請求頭:
通用首部(General Header)
請求首部(Request Header)
響應首部(Response Header)
實體首部(Entity Header Fields)
請求體
常見的請求為GET和POST請求
1、GET請求
http默認的請求方式就是GET
1.1 GET請求報文特點:
- 沒有請求體
- 數據必須在1KB之內
- GET請求數據會暴露在瀏覽器的地址欄中(不安全)
1.2 GET常用操作
- 在瀏覽器的地址欄中直接給出的URL,那么就一定是GET請求
- 點擊頁面上的超鏈接也一定是GET請求
- 提交表單時,表單默認使用GET請求,但可以提交表單時,設置為POST
1.3 GET請求消息頭內容
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:csrftoken=z5H43ZwARx7AIJ82OEizBOWbsAQA2LPk
Host:127.0.0.1:8090
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36
Name
login/
1 requests ❘ 737 B transferred ❘ Finish: 5 ms ❘ DOMContentLoaded: 14 ms ❘ Load: 14 ms
- GET 127.0.0.1:8090/login HTTP/1.1:GET請求,請求服務器路徑為 127.0.0.1:8090/login ,協議為1.1;
- Host:localhost:請求的主機名為localhost;
- User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0*:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的;
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8:告訴服務器,當前客戶端可以接收的文檔類型,其實這里包含了/,就表示什么都可以接收;
- Accept-Language: zh-cn,zh;q=0.5:當前客戶端支持的語言,可以在瀏覽器的工具選項中找到語言相關信息;
- Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮后再發送;
- Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客戶端支持的編碼;
- Connection: keep-alive:客戶端支持的鏈接方式,保持一段時間鏈接,默認為3000ms;從HTTP/1.1起,默認都開啟了。客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的鏈接。
- Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因為不是第一次訪問這個地址,所以會在請求中把上一次服務器響應中發送過來的Cookie在請求中一並發送去過;這個Cookie的名字為JSESSIONID。
2、POST請求
2.1 POST請求特點
- 數據不會出現在地址欄中
- 數據的大小沒有上限
- 有請求實體
- 請求體中如果存在中文,會使用URL編碼。
2.2 POST請求常用操作
- form表單提交
2.3 POST請求消息頭內容
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:13
Content-Type:application/x-www-form-urlencoded
Cookie:csrftoken=z5H43ZwARx7AIJ82OEizBOWbsAQA2LPk
Host:127.0.0.1:8090
Origin:http://127.0.0.1:8090
Pragma:no-cache
Referer:http://127.0.0.1:8090/login/
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36
Form Data
username:dman
- 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個字節。
- username=dman:請求體內容!dman是在表單中輸入的數據,username是表單字段的名字。
重點補充:
Referer請求頭是比較有用的一個請求頭,它可以用來做統計工作,也可以用來做防盜鏈。
- 統計工作:我公司網站在百度上做了廣告,但不知道在百度上做廣告對我們網站的訪問量是否有影響,那么可以對每個請求中的Referer進行分析,如果Referer為百度的很多,那么說明用戶都是通過百度找到我們公司網站的。
- 防盜鏈:我公司網站上有一個下載鏈接,而其他網站盜鏈了這個地址,例如在我網站上的index.html頁面中有一個鏈接,點擊即可下載JDK7.0,但有某個人的微博中盜鏈了這個資源,它也有一個鏈接指向我們網站的JDK7.0,也就是說登錄它的微博,點擊鏈接就可以從我網站上下載JDK7.0,這導致我們網站的廣告沒有看,但下載的卻是我網站的資源。這時可以使用Referer進行防盜鏈,在資源被下載之前,我們對Referer進行判斷,如果請求來自本網站,那么允許下載,如果非本網站,先跳轉到本網站看廣告,然后再允許下載。
三、http響應報文
響應報文的格式如下:
響應首行
響應頭信息
空行
響應體
響應內容是由服務端發送給瀏覽器的內容,瀏覽器會根據響應的內容來顯示,遇到img標簽會開一個新的線程加載,所以網站有時候圖片多的話,文本內容會先顯示出來。
1、響應報文內容
Request URL:http://127.0.0.1:8090/login/
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8090
Response Headers
view source
Content-Type:text/html; charset=utf-8
Date:Wed, 26 Oct 2016 06:48:50 GMT
Server:WSGIServer/0.2 CPython/3.5.2
X-Frame-Options:SAMEORIGIN
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
用戶名:<input type="text" name="username"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
- 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小時的時區差;
2、狀態碼(Status Code)
2.1 狀態碼是什么?
狀態碼是國際約定的一種瀏覽器和服務器之間的響應規則,不同的數值代表不同的含義。
2.2 常用的狀態碼
狀態碼 | 含義 |
---|---|
200 OK | 請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中 |
404 Not Found | 請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源; |
500 Internal Server Error | 請求資源找到了,但服務器內部出現了錯誤; |
302 Found | 重定向,當響應碼為302時,表示服務器要求瀏覽器重新再發一個請求,服務器會發送一個響應頭Location,它指定了新請求的URL地址; |
304 Not Modified | 未按預期修改文檔。客戶端有緩沖的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。 |
補充:
當用戶第一次請求index.html時,服務器會添加一個名為Last-Modified響應頭,這個頭說明了
index.html的最后修改時間,瀏覽器會把index.html內容,以及最后響應時間緩存下來。當用戶第
二次請求index.html時,在請求中包含一個名為If-Modified-Since請求頭,它的值就是第一次請
求時服務器通過Last-Modified響應頭發送給瀏覽器的值,即index.html最后的修改時間,
If-Modified-Since請求頭就是在告訴服務器,我這里瀏覽器緩存的index.html最后修改時間是這個,
您看看現在的index.html最后修改時間是不是這個,如果還是,那么您就不用再響應這個index.html
內容了,我會把緩存的內容直接顯示出來。而服務器端會獲取If-Modified-Since值,與index.html
的當前最后修改時間比對,如果相同,服務器會發響應碼304,表示index.html與瀏覽器上次緩存的相
同,無需再次發送,瀏覽器可以顯示自己的緩存頁面,如果比對不同,那么說明index.html已經做了修
改,服務器會響應200。
更多http狀態碼請看 https://www.cnblogs.com/yanling-coder/p/10742773.html