Http協議

HTTP協議簡介

    HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於萬維網(WWW:World Wide Web)服務器與本地瀏覽器之間傳輸超文本的傳送協議。html

    HTTP是一個屬於應用層的面向對象的協議,因爲簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得不斷地完善和擴展。HTTP協議工做於客戶端-服務端架構之上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即Web服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。瀏覽器

HTTP協議特性

1. 基於TCP/IP

    HTTP協議是基於TCP/IP協議之上的應用層協議服務器

2. 基於請求-響應模式

    HTTP協議規定,請求從客戶端發出,最後服務器端響應該請求並返回。即先從客戶端創建通訊,服務端在沒有接收到請求以前不會發送響應架構

3. 無狀態保存

    HTTP是一種不保存狀態,即無狀態(stateless)協議。HTTP協議自身不對請求和響應之間的通訊狀態進行保存。也就是說在HTTP這個級別,協議對於發送過來的請求或響應都不作持久化處理less

    使用HTTP協議,每當有新的請求發送時,就會有對應的新響應產生。協議自己不保留以前一切的請求或響應報文的信息。這是爲了更快地處理大量事務,確保協議的可伸縮性而特地把HTTP協議設計成如此簡單的。socket

    隨着Web的不斷髮展,因無狀態而致使業務處理變得棘手的狀況增多了。好比,用戶登陸到一家購物網站,即便他跳轉到該站的其餘頁面後,也須要可以繼續保存登陸狀態。針對這個實例,網站爲了可以掌握是誰發出的請求,須要保存用戶狀態。HTTP/1.1雖然是無狀態協議,但爲了實現指望的保持狀態功能,因而引入了Cookie技術。有了Cookie再用HTTP協議通訊,就能夠管理狀態了。分佈式

4. 無鏈接

    無鏈接即限制每鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應籤後,即斷開鏈接。採用這種方式能夠節省傳輸時間。ide

HTTP請求協議與響應協議

    HTTP協議包含由瀏覽器發送數據到服務器須要遵循的請求協議和服務器發送數據到瀏覽器須要遵循的響應協議。網站

    用於HTTP協議交互的信被稱爲HTTP報文。請求端(客戶端)的HTTP報文叫作請求報文,響應端(服務器端)的HTTP報文叫作響應報文。spa

    HTTP報文自己是由多行數據構成的文本。

1. URL

URL: 協議/域名:端口(默認80,默認端口可不寫)/路徑?請求數據

# 例:https://www.baidu.com/s?ie=utf-8&f=8

2. 請求協議

請求方式

1) GET請求

  • GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditBook?name=test1&id=123456
  • GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制)
  • GET請求提交的數據,後臺用request.GET方法獲取

2) POST請求

  • POST提交的數據放在HTTP包的請求體中
  • POST方法提交的數據沒有限制
  • POST請求提交的數據,後臺用request.POST方法獲取

請求格式

1) GET 請求

圖:GET請求報文構成

2) POST請求

圖:POST請求報文構成

 注:請求體用於存放數據。只有POST請求請求報文有請求體。

3. 響應協議

響應格式

圖:響應報文的構成

響應狀態碼

    狀態碼的值是當客戶端向服務器端發送請求時,返回的請求結果。藉助狀態碼,用戶能夠知道服務器端是正常處理了請求,仍是出現了異常。

    狀態碼由3位數字和緣由組成,如200 OK。數字中的第一位指定了響應類別,後兩位無分。響應類別有5 種。

演示示例

import socket


server = socket.socket()
server.bind(("127.0.0.1", 8000))
server.listen(5)

while 1:
    print("server waiting...")
    conn, addr = server.accept()
    data = conn.recv(1024)
    print("data", data)

    with open("login.html", "rb") as f:
        data = f.read()

    conn.send(b"HTTP/1.1 200 OK\r\n\r\n%s" % data)
    conn.close()
server端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="POST">
    用戶名 <input type="text" name="user">
    密碼 <input type="password" name="pwd">
    <input type="submit">
</form>

</body>
</html>
login.html
相關文章
相關標籤/搜索