HTTP協議
FastAPI 是建立在 HTTP 協議之上,所以為了更好的掌握 FastAPI。我們需要先簡單的了解一下 HTTP協議
簡介
HTTP(Hypertext Transfer Protocol)遵循經典的客戶端-服務器模型,客戶端打開連接以發出請求,然后等待直到收到響應。同時也是Web中最基本的協議之一,用于在瀏覽器和服務器之間傳輸超文本和其他資源。
以下是HTTP協議的詳細介紹:
-
基于 TCP/IP協議:
HTTP協議是基于 TCP/IP協議之上的應用層協議 -
請求-響應模型:
HTTP使用請求-響應模型,客戶端發送請求給服務器,服務器處理請求并返回響應給客戶端。換句話說,肯定是客戶端先發送請求,然后服務端接到請求后,再有響應。請求由一個請求行、請求頭部和請求體組成,響應由一個響應行、響應頭部和響應體組成。 -
無狀態:
指HTTP協議本身不會對請求和響應之間的狀態進行持久化。每個HTTP請求都是獨立的,服務器不會保留任何與之前請求相關的狀態信息。
當客戶端發送一個HTTP請求給服務器時,服務器會根據請求進行處理并返回響應。在這個過程中,服務器并不會記住之前的請求或與之相關的任何狀態。每個請求都是相互獨立的,服務器只會根據當前請求的內容和上下文進行處理。 -
請求方法:
HTTP定義了多種請求方法,常用的包括:-
GET:獲取指定資源的表示
-
POST:在服務器上創建新資源
-
PUT:更新指定資源的表示
-
DELETE:刪除指定資源
-
-
URL(Uniform Resource Locator):
URL用于標識和定位互聯網上的資源。它由協議類型(如HTTP)、主機名、端口號、路徑和查詢參數等組成,例如:http://example.com/path?param=value。 -
請求頭部:
請求頭部包含了客戶端向服務器發送的附加信息,例如User-Agent、Accept-Language、Content-Type等。這些頭部信息提供了請求的上下文和要求。 -
響應狀態碼:
HTTP定義了多種狀態碼,用于表示服務器對請求的處理結果。比如:-
200 OK:請求成功
-
404 Not Found:請求的資源不存在
-
500 Internal Server Error:服務器內部錯誤
-
-
響應頭部:
響應頭部包含了服務器返回的附加信息,如Content-Type、Content-Length、Cache-Control等。這些頭部信息提供了相應的上下文和屬性。 -
請求和響應體:
請求體用于發送數據給服務器,通常在POST和PUT請求中使用。響應體包含了服務器返回的數據,可以是HTML文檔、JSON數據、圖片等。 -
Cookie和會話管理:
HTTP支持使用Cookie來跟蹤和管理會話狀態。服務器可以在響應中設置Cookie,而客戶端會將Cookie保存并在隨后的請求中發送給服務器。 -
安全性:
HTTP本身是無狀態和明文的協議,因此對于敏感信息的傳輸,需要使用HTTPS(HTTP over TLS)來進行加密和身份驗證,以確保通信的安全性。
HTTP協議是Web通信的核心協議之一,它定義了客戶端和服務器之間的請求和響應交互方式。通過遵循HTTP協議,瀏覽器和服務器能夠進行可靠和高效的通信,實現Web應用程序的開發和交互。
請求行、請求體和請求頭
一個HTTP請求由請求行、請求頭部和請求體組成。下面詳細介紹每個部分的內容:
-
請求行(Request Line):請求行包含了請求的方法、URL和HTTP協議版本。它的格式如下:
METHOD URL HTTP_VERSION
- METHOD是請求的方法,例如GET、POST、PUT等。
- URL是請求的目標資源的URL,包括協議、主機名、端口號、路徑和查詢參數等。
- HTTP_VERSION是HTTP協議的版本,如HTTP/1.1。
-
請求頭部(Request Headers):請求頭部包含了客戶端向服務器發送的附加信息。每個請求頭部都由一個鍵值對組成,格式為
Header-Name: Header-Value
。一些常見的請求頭部包括:- User-Agent:指定客戶端的用戶代理(通常是瀏覽器),用于服務器識別客戶端的類型和版本。
- Accept:指定客戶端能夠接受的響應內容類型。
- Content-Type:指定請求體的內容類型。
- Authorization:用于身份驗證,包含了認證憑證。
-
請求體(Request Body):請求體用于在POST、PUT等請求方法中發送數據給服務器。它包含了請求的有效載荷,可以是表單數據、JSON數據、文件等。請求體的格式和內容類型由Content-Type頭部指定。需要注意 GET 請求沒有請求體,它的參數在請求行里面。
請求行和請求頭部都是以CRLF(回車換行符)作為分隔符進行分割,最后以一個空行表示頭部結束。如果請求有請求體,則緊跟在空行之后。
以下是一個完整的HTTP請求的例子,包括請求行、請求頭部和請求體:
POST /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36
Content-Type: application/json
Content-Length: 52{"username": "john","password": "secretpassword"
}
在這個例子中:
請求行:POST /api/users HTTP/1.1
- 請求方法為POST,表示希望在服務器上創建新的資源。
- URL為
/api/users
,表示目標資源的路徑。 - HTTP版本為HTTP/1.1。
請求頭部:
- Host: example.com:指定請求的目標服務器的主機名。
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36:指定客戶端的用戶代理,告訴服務器使用的瀏覽器和操作系統信息。
- Content-Type: application/json:指定請求體的內容類型為JSON格式。
- Content-Length: 52:指定請求體的長度,以字節為單位。
請求體:
{"username": "john","password": "secretpassword"
}
請求體是一個JSON格式的數據,在這個例子中包含了用戶名和密碼字段。
總結來說,這個例子展示了一個使用POST方法發送JSON數據的HTTP請求。請求行指定了請求方法、URL和HTTP版本。請求頭部包含了附加的請求信息,如主機名、用戶代理和內容類型。請求體包含了要發送給服務器的數據。
響應行、響應頭部和響應體
HTTP協議中的響應由一個響應行、響應頭部和響應體組成。以下是它們的詳細說明:
-
響應行(Response Line):響應行是HTTP響應的第一行,它包含了協議版本、狀態碼和狀態消息。例如,一個典型的響應行可能是這樣的:HTTP/1.1 200 OK。其中,"HTTP/1.1"是協議版本,"200"是狀態碼,"OK"是狀態消息。
-
響應頭部(Response Headers):響應頭部包含了關于響應的元信息,如服務器類型、日期、內容類型等。它由多個以冒號分隔的鍵值對組成,每個鍵值對占據一行。例如,以下是一些常見的響應頭部字段:
- Content-Type:指定了響應體的MIME類型,例如"text/html"表示HTML文檔。
- Content-Length:指定了響應體的長度,以字節為單位。
- Server:指定了服務器的類型和版本信息。
- Date:指定了響應生成的日期和時間。
-
響應體(Response Body):響應體包含了實際的響應數據。它可以是HTML文檔、JSON數據、圖像等等,具體取決于請求所期望的內容類型和服務器的支持。響應體通常位于響應頭部之后的空行之后。
以下是一個完整的HTTP響應的例子,包括響應行、響應頭部和響應體,其中響應體為JSON格式:
HTTP/1.1 200 OK
Date: Tue, 02 Mar 2024 12:00:00 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Content-Type: application/json
Content-Length: 52{"message": "Hello, world!","status": 200
}
在這個例子中:
響應行:HTTP/1.1 200 OK
- HTTP版本為HTTP/1.1。
- 狀態碼為200,表示請求成功。
- 狀態消息為OK,表示請求被成功處理。
響應頭部:
- Date: Tue, 02 Mar 2024 12:00:00 GMT:指定響應生成的日期和時間。
- Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips:指定服務器的軟件和版本信息。
- Content-Type: application/json:指定響應體的內容類型為JSON格式。
- Content-Length: 52:指定響應體的長度,以字節為單位。
響應體:
{"message": "Hello, world!","status": 200
}
響應體是一個JSON格式的數據,在這個例子中包含了一個消息和狀態字段。
總結來說,這個例子展示了一個使用HTTP/1.1協議的HTTP響應。響應行指定了HTTP版本、狀態碼和狀態消息。響應頭部包含了附加的響應信息,如日期、服務器信息和內容類型。響應體包含了服務器返回的實際數據,可以是JSON、HTML、圖片等不同類型的數據。
擴展
HTTP協議和Socket
HTTP協議和Socket之間存在密切的關系。HTTP協議是一種應用層協議,用于在客戶端和服務器之間傳輸超文本數據(例如網頁、圖片等)。而Socket是一種用于網絡通信的編程接口,提供了在網絡上發送和接收數據的能力。
HTTP協議使用了底層的Socket技術來進行通信。當客戶端發送HTTP請求時,它會創建一個Socket連接到服務器的指定端口,并通過Socket發送請求。服務器在接收到請求后,也通過Socket向客戶端發送HTTP響應。
具體來說,客戶端在與服務器建立連接時,會創建一個客戶端Socket。客戶端Socket會與服務器的IP地址和端口號相關聯,用于在網絡上與服務器進行通信。客戶端通過Socket發送HTTP請求,并接收服務器發送的HTTP響應。
服務器端也會創建一個服務器Socket,用于監聽指定的端口,并等待客戶端的連接請求。當服務器接收到客戶端連接請求后,會為該客戶端創建一個與之關聯的Socket。服務器通過這個Socket與客戶端進行通信,接收客戶端的HTTP請求,并發送HTTP響應。
Socket提供了一種基于TCP/IP協議的可靠的雙向通信方式。HTTP協議利用Socket提供的底層通信能力,在客戶端和服務器之間傳輸HTTP請求和響應數據。Socket隱藏了底層網絡細節,使得開發人員可以更方便地使用HTTP協議進行網絡通信。
總結來說,HTTP協議和Socket密切相關,Socket提供了HTTP協議進行通信所需的底層網絡傳輸能力,使得客戶端和服務器可以通過HTTP協議進行數據交換。