[CodeIgniter4]概述-處理 HTTP 請求
- 2020 年 3 月 5 日
- 筆記
處理 HTTP 請求
為了充分地使用 CodeIgniter,你需要對 HTTP 請求和響應的工作方式有基本的了解。對於所有想要成功的開發者來說, 理解 HTTP 背後的概念是 必須 的。
本章的第一部分會給出一些關於 HTTP 的概述,接着我們會討論怎樣用 CodeIgniter 來處理 HTTP 請求與響應。
什麼是 HTTP ?
HTTP 是兩台計算機相互通信的一種基於文本的協議。當瀏覽器請求頁面時,它會詢問服務器是否可以獲取該頁面。然後, 服務器準備頁面並將響應發送回發送請求的瀏覽器。就是這樣簡單,也可以說複雜些,但基本就是這樣。
HTTP 是用於描述該交換約定的術語。它代表超文本傳輸協議(Hypertext Transfer Protocol)。開發 web 應用程序時, 你的目標只是了解瀏覽器的要求,並能夠做出適當的響應。
HTTP 請求
當客戶端(瀏覽器,手機軟件等)嘗試發送 HTTP 請求時,客戶端會向服務器發出一條文本消息然後等待響應。
這條文本消息會像這樣:
GET / HTTP/1.1 Host codeigniter.com Accept: text/html User-Agent: Chrome/46.0.2490.80
這條消息包含了所有服務器可能需要的信息。比如它請求的 method(GET,POST,DELETE 等)、它的 HTTP 版本。
該請求還包括許多可選的請求頭字段,這些頭字段可以包含各種信息,例如客戶端希望內容顯示為哪種語言, 客戶端接受的格式類型等等。 Wikipedia 上有一篇文章,列出了 所有的請求頭字段 (譯者註:國內用戶如果無法訪問的話, 可以查看 在MDN上的頁面 )。
HTTP 響應
服務器收到請求後,你的 web 應用程序會處理這條信息然後輸出一些響應結果。服務器會將你的響應結果打包為對 客戶端的的你的響應結果打包為對客戶端的響應的一部分。服務器對客戶端的響應消息看起來會像這樣:
HTTP/1.1 200 OK Server: nginx/1.8.0 Date: Thu, 05 Nov 2015 05:33:22 GMT Content-Type: text/html; charset=UTF-8 <html> . . . </html>
響應消息告訴客戶端服務器正在使用的 HTTP 版本規範,以及響應狀態碼(200)。狀態碼是標準化的對客戶端具有非常特定 含義的代碼。它可以告訴客戶端響應成功(200),或者找不到頁面(404)等等。 在 IANA 可以找到 完整的響應狀態碼列表 。
對 HTTP 請求和響應的處理
雖然 PHP 提供了與 HTTP 請求和響應進行交互的原生方式,但 CodeIgniter 像大多數框架一樣,將它們抽象化,讓你擁有一個 一致、簡單的接口。IncomingRequest 類 類是 HTTP 請求的面向對象的表示形式。 它提供你所需要的一切:
use CodeIgniterHTTPIncomingRequest; $request = new IncomingRequest(new ConfigApp(), new CodeIgniterHTTPURI()); // 請求的 uri(如 /about ) $request->uri->getPath(); // 檢索 $_GET 與 $_POST 變量 $request->getVar('foo'); $request->getGet('foo'); $request->getPost('foo'); // 從 AJAX 調用中檢索 JSON $request->getJSON(); // 檢索 server 變量 $request->getServer('Host'); // 檢索 HTTP 請求頭,使用不區分大小寫的名稱 $request->getHeader('host'); $request->getHeader('Content-Type'); $request->getMethod(); // GET, POST, PUT 等等
request 類會在後台為你做很多工作,你無需擔心。 isAJAX()
和 isSecure()
函數會自動檢查幾種不同的 method 來 最後確定正確的答案。
CodeIgniter 還提供了 Response 類 ,它是 HTTP 響應的面向對象式表示。 它為你提供一種簡單而強大的方法來構造對客戶的響應:
use CodeIgniterHTTPResponse; $response = new Response(); $response->setStatusCode(Response::HTTP_OK); $response->setBody($output); $response->setHeader('Content-type', 'text/html'); $response->noCache(); // 把響應結果發給瀏覽器 $response->send();
另外, Response 類 還允許你處理 HTTP 緩存層以獲得最佳性能。