data-id="1190000004868343">
當我關注到HTTP 層的時候,發現很多CIer 對內容協商還不是很了解,下面我們一起來探討一下什麼是內容協商,以及如何在即將到來的CodeIgniter 4 中使用他。
什麼是內容協商?
簡而言之,內容協商是指客戶端和伺服器端就回應的資源內容進行交涉,然後提供給客戶端最適合的資源。內容協商會以回應資源的語言、圖片類型和編碼方式等作為判斷的基準(包含在請求頭中的某些 Accept
欄位就是判斷的基準)。
舉個例子,我用Chrome 訪問Mozilla 的站點,可以看到下面的HTTP 請求頭資訊:
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/ webp,/;q=0.8
accept-encoding:gzip, deflate, sdch
accept-language:en-US,en;q=0.8
accept-language:en-US,en;q=0.8所支援的格式,並提供這些格式的優先順序資訊(透過q 的值來確定優先順序)。以上資訊說明瀏覽器在所有支援的內容類型中更希望接收 text/html 類型的內容。由於我的瀏覽器的語言設定是英語,所以
accept-language
請求頭表示我更喜歡美式英語(en-US)的頁面。
很顯然,即使我們不提供任何內容協商信息,Web 站點還是可以照常運行,並且我們已經這樣做了很多年。然而事實上 Web 伺服器可以幫我們處理某些形式的內容協商,我們通常不太善於利用這一點,但這並不意味著伺服器不能處理這些資訊。
內容協商有兩個很吸引人的用處,一個是用於那些支援多國語言的站點,另一個是用於返回特定格式資料的 API 介面。
是不是必須要使用內容協商?可能不一定,他也許是把雙刃劍,有些人提議不要使用他,有些人認為他就像切片麵包一樣令人喜愛。但如果你想用,那麼在 CodeIgniter 中使用內容協商也是很容易的。
一個簡單的例子
這裡我不會對內容協商作過多詳細的介紹(詳細介紹將寫到用戶手冊中),這個例子簡單介紹了內容協商是如何確定輸出語言的。
<code>class BaseController extends \CodeIgniter\Controller { protected $language; public function __construct(...$params) { parent::__construct(...$params); $supportedLangs = ['en-US', 'en', 'fr']; $this->language = $this->request->negotiate('language', $supportedLangs); } }</code>
這個例子表示該網站可以支援英語和法語,我們將支援的語言賦值到$supportedLangs
數組裡,預示著預設語言是美式英語,但也支援普通英語和法語,然後簡單地呼叫$negotiate ->language()
方法,傳遞支援的語言類型,解析時就能辨識正確的HTTP 頭,然後依照陣列裡定義的優先順序,傳回最符合的結果。如果兩種語言都無法匹配,就會使用陣列中的第一種語言。
Negotiate 類別中的4 個協商方法分別為:
media() 不同於通常的Accept
請求頭,他可以用來請求不同版本的html/text,或者音頻支持,圖像支持,等等。
charset() 不同於 Accept-Charset
請求頭,如果沒有匹配的話,預設值為 UTF-8。
encoding() 不同於 Accept-Encoding
請求頭,可以決定任何客戶端支援使用的壓縮型別。
language() 不同於 Accept-Language
請求頭。
並不是所有場景都用得著內容協商,但他卻是構建高品質 API 的一個有力工具,並且也能夠創造性的應用於其他地方。
以上就介紹了CodeIgniter 4 的內容協商,包括了codeigniter方面的內容,希望對PHP教學有興趣的朋友有幫助。