版本說(shuō)明
當(dāng)前版本號(hào)[20231114]。
版本 | 修改說(shuō)明 |
---|---|
20231114 | 初版 |
目錄
HTTP協(xié)議
1、網(wǎng)址
1.1 網(wǎng)址的概念
網(wǎng)址又稱(chēng)為URL,URL的英文全拼是(Uniform Resoure Locator),表達(dá)的意思是統(tǒng)一資源定位符,通俗理解就是網(wǎng)絡(luò)資源地址。
URL地址:https://www.itcast.com/18/1122/10/E178J2O4000189FH.html
1.2 URL的組成
域名:IP地址的別名,它是用點(diǎn)進(jìn)行分割使用英文字母和數(shù)字組成的名字,使用域名目的就是方便的記住某臺(tái)主機(jī)IP地址。
參數(shù)說(shuō)明:? 后面的page表示第一個(gè)參數(shù),后面的參數(shù)都使用 & 進(jìn)行連接
1.3 知識(shí)要點(diǎn)
網(wǎng)址就是網(wǎng)絡(luò)資源的地址,又稱(chēng)為URL,通過(guò)URL能夠找到對(duì)應(yīng)的資源數(shù)據(jù)。
URL組成部分:
- 協(xié)議部分
- 域名部分
- 資源路徑部分
- 查詢(xún)參數(shù)部分[可選]
2、HTTP協(xié)議的介紹
通過(guò)HTTP協(xié)議來(lái)規(guī)定瀏覽器和web服務(wù)器之間通訊的數(shù)據(jù)的格式
2.1 HTTP協(xié)議的概念及作用
? HTTP協(xié)議的全稱(chēng)是(HyperText Transfer Protocol),翻譯過(guò)來(lái)就是超文本傳輸協(xié)議。
? 超文本是指在文本數(shù)據(jù)的基礎(chǔ)上還包括非文本數(shù)據(jù),非文本數(shù)據(jù)有圖片、音樂(lè)、視頻等,而這些非文本數(shù)據(jù)會(huì)使用鏈接的方式進(jìn)行加載顯示,通俗來(lái)說(shuō)超文本就是帶有鏈接的文本數(shù)據(jù)也就是我們常說(shuō)的網(wǎng)頁(yè)數(shù)據(jù)。
2.2 HTTP協(xié)議的概念及作用
? HTTP協(xié)議的制作者是蒂姆·伯納斯-李,1991年設(shè)計(jì)出來(lái)的,HTTP協(xié)議設(shè)計(jì)之前目的是傳輸網(wǎng)頁(yè)數(shù)據(jù)的,現(xiàn)在允許傳輸任意類(lèi)型的數(shù)據(jù)。它是瀏覽器和Web服務(wù)器傳輸數(shù)據(jù)的一個(gè)協(xié)議(HTTP)。
傳輸HTTP協(xié)議格式的數(shù)據(jù)是基于TCP傳輸協(xié)議的,發(fā)送數(shù)據(jù)之前需要先建立連接。
TCP傳輸協(xié)議是用來(lái)保證網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)的安全性的,HTTP協(xié)議是用來(lái)規(guī)定這些數(shù)據(jù)的具體格式的。
注意:
? HTTP協(xié)議規(guī)定的數(shù)據(jù)格式是瀏覽器和Web服務(wù)器通信數(shù)據(jù)的格式,也就是說(shuō)瀏覽器和Web服務(wù)器通信需要使用HTTP協(xié)議。
2.3 瀏覽器訪問(wèn)Web服務(wù)器的過(guò)程
注意:
HTTP協(xié)議分別規(guī)定了請(qǐng)求數(shù)據(jù)的格式,響應(yīng)數(shù)據(jù)的格式。并且他們一般都是成對(duì)出現(xiàn)的
3、HTTP請(qǐng)求報(bào)文
3.1 HTTP最常見(jiàn)的請(qǐng)求報(bào)文有兩種
- GET方式的請(qǐng)求報(bào)文
- POST方式的請(qǐng)求報(bào)文
說(shuō)明:
- GET: 獲取Web服務(wù)器數(shù)據(jù)
- POST: 向Web服務(wù)器提交數(shù)據(jù)
3.2 HTTP GET請(qǐng)求報(bào)文分析
---- 請(qǐng)求行 ----
GET /a/b/c HTTP/1.1 # GET請(qǐng)求方式 請(qǐng)求資源路徑 HTTP協(xié)議版本
---- 請(qǐng)求頭 -----
Host: www.itcast.cn # 服務(wù)器的主機(jī)地址和端口號(hào),默認(rèn)是80
Connection: keep-alive # 和服務(wù)端保持長(zhǎng)連接
Upgrade-Insecure-Requests: 1 # 讓瀏覽器升級(jí)不安全請(qǐng)求,使用https請(qǐng)求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 用戶(hù)代理,也就是客戶(hù)端的名稱(chēng)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的數(shù)據(jù)類(lèi)型
Accept-Encoding: gzip, deflate # 可接受的壓縮格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的語(yǔ)言
Cookie: pgv_pvi=1246921728; # 登錄用戶(hù)的身份標(biāo)識(shí)
---- 空行 ----
GET / HTTP/1.1\r\n
Host: www.itcast.cn\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n
\r\n (請(qǐng)求頭信息后面還有一個(gè)單獨(dú)的’\r\n’不能省略)
說(shuō)明:
每項(xiàng)數(shù)據(jù)之間使用:\r\n
3.3 HTTP POST請(qǐng)求報(bào)文分析
---- 請(qǐng)求行 ----
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1 # POST請(qǐng)求方式 請(qǐng)求資源路徑 HTTP協(xié)議版本
---- 請(qǐng)求頭 ----
Host: mail.itcast.cn # 服務(wù)器的主機(jī)地址和端口號(hào),默認(rèn)是80
Connection: keep-alive # 和服務(wù)端保持長(zhǎng)連接
Content-Type: application/x-www-form-urlencoded # 告訴服務(wù)端請(qǐng)求的數(shù)據(jù)類(lèi)型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客戶(hù)端的名稱(chēng)
---- 空行 ----
---- 請(qǐng)求體 ----
username=hello&pass=hello # 請(qǐng)求參數(shù)
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1\r\n
Host: mail.itcast.cn\r\n
Connection: keep-alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
\r\n(請(qǐng)求頭信息后面還有一個(gè)單獨(dú)的’\r\n’不能省略)
username=hello&pass=hello
說(shuō)明:
每項(xiàng)數(shù)據(jù)之間使用:\r\n
3.4 知識(shí)要點(diǎn)
4、HTTP響應(yīng)報(bào)文
4.1 HTTP 響應(yīng)報(bào)文分析
響應(yīng)行是由三部分組成:HTTP協(xié)議版本 狀態(tài)碼 狀態(tài)描述
--- 響應(yīng)行/狀態(tài)行 ---
HTTP/1.1 200 OK # HTTP協(xié)議版本 狀態(tài)碼 狀態(tài)描述
--- 響應(yīng)頭 ---
Server: Tengine # 服務(wù)器名稱(chēng)
Content-Type: text/html; charset=UTF-8 # 內(nèi)容類(lèi)型
Connection: keep-alive # 和客戶(hù)端保持長(zhǎng)連接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服務(wù)端的響應(yīng)時(shí)間
--- 空行 ---
--- 響應(yīng)體 ---
<!DOCTYPE html><html lang=“en”> …</html> # 響應(yīng)給客戶(hù)端的數(shù)據(jù)
4.2 HTTP 狀態(tài)碼介紹
狀態(tài)碼是用于表示W(wǎng)eb服務(wù)器響應(yīng)狀態(tài)的3位數(shù)字代碼
最常見(jiàn)的狀態(tài)碼是200
5、查看HTTP協(xié)議的通信過(guò)程
5.1 谷歌瀏覽器開(kāi)發(fā)者工具的使用
? 安裝Google Chrome瀏覽器,在Windows和Linux平臺(tái)按F12調(diào)出開(kāi)發(fā)者工具, Mac中選擇“視圖 ->開(kāi)發(fā)者 ->”開(kāi)發(fā)者工具或者直接使用 alt+command+i 這個(gè)快捷鍵,還有一個(gè)多平臺(tái)通用的操作就是在網(wǎng)頁(yè)右擊選擇檢查。
提示:開(kāi)發(fā)者工具還是查看網(wǎng)頁(yè)布局和JS代碼調(diào)試的利器。
? 注意:每一次瀏覽器和服務(wù)器的數(shù)據(jù)通訊,都是成對(duì)出現(xiàn)的即請(qǐng)求和響應(yīng),同時(shí)每一次請(qǐng)求和響應(yīng)都必須符合HTTP協(xié)議的格式。
標(biāo)簽選項(xiàng)說(shuō)明:
元素(Elements):用于查看或修改HTML標(biāo)簽
控制臺(tái)(Console):執(zhí)行JS代碼
源代碼(Sources):查看靜態(tài)資源文件,斷點(diǎn)調(diào)試JS代碼
網(wǎng)絡(luò)(Network):查看http協(xié)議的通信過(guò)程
使用說(shuō)明:
- 點(diǎn)擊Network標(biāo)簽選項(xiàng)
- 在瀏覽器地址欄輸入百度的網(wǎng)址,就能看到請(qǐng)求百度首頁(yè)的HTTP的通信過(guò)程
- 這里的每項(xiàng)記錄都是請(qǐng)求+響應(yīng)的一次過(guò)程
5.2 查看HTTP協(xié)議的通信過(guò)程
5.3 知識(shí)要點(diǎn)
? 谷歌瀏覽器的開(kāi)發(fā)者工具是查看http協(xié)議的通信過(guò)程利器,通過(guò)Network標(biāo)簽選項(xiàng)可以查看每一次的請(qǐng)求和響應(yīng)的通信過(guò)程,調(diào)出開(kāi)發(fā)者工具的通用方法是在網(wǎng)頁(yè)右擊選擇檢查。
Headers選項(xiàng)總共有三部分組成:
①General: 主要信息
②Response Headers: 響應(yīng)頭
③Request Headers: 請(qǐng)求頭
Response選項(xiàng)是查看響應(yīng)體信息的
靜態(tài)Web服務(wù)器程序開(kāi)發(fā)
6、 搭建Python自帶的靜態(tài)Web服務(wù)器
6.1 什么是靜態(tài)Web服務(wù)器?
可以為發(fā)出請(qǐng)求的瀏覽器提供靜態(tài)文檔的程序。
? 平時(shí)我們?yōu)g覽百度新聞數(shù)據(jù)的時(shí)候,每天的新聞數(shù)據(jù)都會(huì)發(fā)生變化,那訪問(wèn)的這個(gè)頁(yè)面就是動(dòng)態(tài)的,而我們開(kāi)發(fā)的是靜態(tài)的,每天訪問(wèn)我們自己的靜態(tài)web服務(wù)器,頁(yè)面的數(shù)據(jù)不會(huì)發(fā)生變化。
6.2 搭建Python自帶的靜態(tài)Web服務(wù)器
? -m表示運(yùn)行包里面的模塊,執(zhí)行這個(gè)命令的時(shí)候,需要進(jìn)入你自己指定靜態(tài)文件的目錄,然后通過(guò)瀏覽器就能訪問(wèn)對(duì)應(yīng)的html文件了,這樣一個(gè)靜態(tài)的web服務(wù)器就搭建好了。
6.3 訪問(wèn)搭建的靜態(tài)Web服務(wù)器
訪問(wèn)Web服務(wù)器:
6.4 查看瀏覽器和搭建的靜態(tài)Web服務(wù)器的通信過(guò)程
HTTP的通信過(guò)程:
6.5 知識(shí)要點(diǎn)
? 靜態(tài)Web服務(wù)器是為發(fā)出請(qǐng)求的瀏覽器提供靜態(tài)文檔的程序,搭建Python自帶的Web服務(wù)器使用 python3 –m http.server 端口號(hào)這個(gè)命令即可,端口號(hào)不指定默認(rèn)是8000
強(qiáng)調(diào)!應(yīng)答體中攜帶的數(shù)據(jù)發(fā)送到瀏覽器,瀏覽器經(jīng)過(guò)渲染產(chǎn)生具體頁(yè)面.
7、靜態(tài)Web服務(wù)器-返回固定頁(yè)面數(shù)據(jù)
7.1 開(kāi)發(fā)自己的靜態(tài)Web服務(wù)器
開(kāi)發(fā)步驟:
- 編寫(xiě)一個(gè)TCP服務(wù)端程序。
- 獲取瀏覽器發(fā)送的HTTP請(qǐng)求報(bào)文數(shù)據(jù)。
- 讀取固定頁(yè)面數(shù)據(jù),把頁(yè)面數(shù)據(jù)組裝成HTTP響應(yīng)報(bào)文數(shù)據(jù)發(fā)送給瀏覽器。
- HTTP響應(yīng)報(bào)文數(shù)據(jù)發(fā)送完成以后,關(guān)閉服務(wù)于客戶(hù)端的套接字。
TCP服務(wù)端程序代碼:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-758257.html
import socket
# 創(chuàng)建tcp服務(wù)端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 設(shè)置socket選項(xiàng),立即釋放端口
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 綁定端口號(hào)
tcp_server_socket.bind((“”, 9090))
# 設(shè)置監(jiān)聽(tīng)
tcp_server_socket.listen(128)
# 循環(huán)接收客戶(hù)端的連接請(qǐng)求
while True:
conn_socket, ip_port = tcp_server_socket.accept()
7.2 獲取瀏覽器的HTTP請(qǐng)求報(bào)文
import socket
# 創(chuàng)建tcp服務(wù)端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 中間代碼省略……
# 循環(huán)接收客戶(hù)端的連接請(qǐng)求
while True:
conn_socket, ip_port = tcp_server_socket.accept()
# 獲取客戶(hù)端的請(qǐng)求報(bào)文數(shù)據(jù)
client_request_data = conn_socket.recv(4096)
print(client_request_data)
7.3 組裝固定頁(yè)面數(shù)據(jù)的響應(yīng)報(bào)文
# 使用rb的原因是瀏覽器也有可能請(qǐng)求的是圖片
with open(“index.html”, “rb”) as file:
file_data = file.read()
response_line = “HTTP/1.1 200 OK\r\n” # 響應(yīng)行
# 響應(yīng)頭
response_header = "Server: PWS1.0\r\nContent-Type: text/html;charset=utf-8\r\n"
response_body = file_data # 響應(yīng)體
# 拼接響應(yīng)報(bào)文數(shù)據(jù)
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
# 發(fā)送響應(yīng)報(bào)文數(shù)據(jù)
conn_socket.send(response_data)
conn_socket.close()
7.4 知識(shí)要點(diǎn)
- 編寫(xiě)一個(gè)TCP服務(wù)端程序
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 循環(huán)接收客戶(hù)端的連接請(qǐng)求
while True:
conn_socket, ip_port = tcp_server_socket.accept()
- 獲取瀏覽器發(fā)送的http請(qǐng)求報(bào)文數(shù)據(jù)
client_request_data = conn_socket.recv(4096)
- 讀取固定頁(yè)面數(shù)據(jù),把頁(yè)面數(shù)據(jù)組裝成HTTP響應(yīng)報(bào)文數(shù)據(jù)發(fā)送給瀏覽器。
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
conn_socket.send(response_data)
- HTTP響應(yīng)報(bào)文數(shù)據(jù)發(fā)送完成以后,關(guān)閉服務(wù)于客戶(hù)端的套接字。
conn_socket.close()
后續(xù)待補(bǔ)充!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758257.html
到了這里,關(guān)于Python-Python高階技巧:HTTP協(xié)議、靜態(tài)Web服務(wù)器程序開(kāi)發(fā)、循環(huán)接收客戶(hù)端的連接請(qǐng)求的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!