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