摘要:然而事實上服務器可以幫我們處理某些形式的內容協商,我們通常不太善于利用這一點,但并不意味著服務器不能處理這些信息。但如果你想用,那在中使用內容協商也是很容易的。
當我關注到 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 信息告訴我們瀏覽器所支持的格式,并提供這些格式的優先級信息(通過 q 的值來確定優先級)。以上信息說明瀏覽器在所有支持的內容類型中更希望接收 text/html 類型的內容。由于我的瀏覽器的語言設置是英語,所以 accept-language 請求頭表示我更喜歡美式英語(en-US)的頁面。
很顯然,即使我們不提供任何內容協商信息,Web 站點還是可以照常運行,并且我們已經這樣做了很多年。然而事實上 Web 服務器可以幫我們處理某些形式的內容協商,我們通常不太善于利用這一點,但并不意味著服務器不能處理這些信息。
內容協商有兩個很吸引人的用處,一個是用于那些支持多國語言的站點,另一個是用于返回特定格式數據的 API 接口。
是不是必須要使用內容協商呢?可能不一定,他也許是把雙刃劍,有些人提議不要使用他,也有些人認為他就像切片面包一樣令人喜愛。但如果你想用,那在 CodeIgniter 中使用內容協商也是很容易的。
一個簡單的例子這里我不會對內容協商作過多詳細的介紹(詳細介紹將寫到用戶手冊中),這個例子簡單介紹了內容協商是如何確定輸出語言的。
class BaseController extends CodeIgniterController { protected $language; public function __construct(...$params) { parent::__construct(...$params); $supportedLangs = ["en-US", "en", "fr"]; $this->language = $this->request->negotiate("language", $supportedLangs); } }
這個例子表示該站點可以支持英語和法語,我們將支持的語言賦值到 $supportedLangs 數組里,預示著默認語言是美式英語,但也支持普通英語和法語,然后簡單調用 $negotiate->language() 方法,傳遞支持的語言類型,解析時就能識別正確的 HTTP 頭,然后按照數組里定義的優先級順序,返回最匹配的結果。如果兩種語言都無法匹配,就會使用數組中的第一個語言。
Negotiate 類中的 4 個協商方法分別為:
media() 不同于通常的 Accept 請求頭,他可以用來請求不同版本的 html/text,或者音頻支持,圖像支持,等等。
charset() 不同于 Accept-Charset 請求頭,如果沒有匹配的話,默認值為 UTF-8。
encoding() 不同于 Accept-Encoding 請求頭,可以決定任何客戶端支持使用的壓縮類型。
language() 不同于 Accept-Language 請求頭。
并不是所有場景都用得著內容協商,但他卻是構建高質量 API 的一個有力工具,并且也能夠創造性的應用于其他地方。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21514.html
摘要:在版中,我們將更加模塊化層,并構建全新的類結構來同時處理的請求和響應。類類用于把程序的執行結果返回給客戶端。類會捕獲控制器的輸出,并自動設置為響應的主體。在需要的時候,框架為你提供了精確控制響應的能力。 CodeIgniter 4 對輸入和輸出的處理方式做了一個較大的改變。在上一個版本中,包括最新的 V3 版,輸入和輸出分別是用兩個包含相關函數的類來處理的。這樣的處理方式背后雖然沒有什...
摘要:行,是否強制訪問。行,嘗試處理此次請求,詳細見方法。至此,的執行主流程完畢。小結是的核心文件,它被調用后,完成了諸多的主流程操作。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 Codeigniter.php 是 CI 4 的核心所在,在這里接收并處理了 request 請求,安全檢查,緩存處理, URL 解析以及路由匹配,執行過濾器,加載運行 Controll...
摘要:首先你應該是在用以上的版本,如果版本在這之下,是時候該升級了。按照其官網的說法,這個組織的目的并不是告訴你你應該怎么做,只是一些主流的框架之間相互協商和約定。和沒有出現在以上的列表中,是因為還沒有投票通過。不要被這些話所困擾。 首先你應該是在用 PHP 5.3 以上的版本,如果 PHP 版本在這之下,是時候該升級了。我建議如果有條件,最好使用最新的版本。 你應該看過 PHP The R...
摘要:經過漫長的艱苦奮斗,版今天終于發布了。該版本具備所有主要功能,但仍存在一些問題。認為缺少什么在論壇中發布帖子。我們將很快在論壇啟動候選新功能的工作,我們將從論壇中選出有價值的內容你使用該版本時遇到的問題在論壇中發布帖子。 經過漫長的艱苦奮斗,CodeIgnier 4.0.0 alpha 1 版今天終于發布了。 向 Lonnie Ezell 致敬!感謝他為實現愿景和核心實施所做的所有努力...
摘要:行,判斷如果為空,那么返回默認路由。行,把處理完畢后找到的返回。方法該方法是自動按著約定規則去目錄去找路由的過程。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 我個人覺得在當前 MVC 流行的架構下,要想去了解一個框架,或者是一個基于此架構下的應用程序,最好的入手方式就是先看路由,雖然路由不是 MVC 里的任何一個,但是知道了路由的來龍去脈就知道了整個框架或者...
閱讀 3256·2023-04-26 02:10
閱讀 2880·2021-10-12 10:12
閱讀 4559·2021-09-27 13:35
閱讀 1519·2019-08-30 15:55
閱讀 1058·2019-08-29 18:37
閱讀 3423·2019-08-28 17:51
閱讀 1954·2019-08-26 13:30
閱讀 1191·2019-08-26 12:09