W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
內容協(xié)商是一種用來根據(jù)客戶端和服務端可處理的資源類型,來決定返回給客戶端哪種類型的內容的機制。 該機制可用來決定客戶端是想要 HTML 還是想要 JSON ,一個圖片是應該以 JPG 還是以 PNG 格式返回,或者支持哪種類型的壓縮方法等。 這些決策是通過分析四個不同的請求頭,而這些請求頭里支持多個帶有優(yōu)先級的值選項。手動對這些值選項進行優(yōu)先級匹配通常是較有挑戰(zhàn)性的,因此 CodeIgniter提供了 Negotiator
來處理以上過程。
你可以通過 Service 類來手動加載一個該類的實例:
$negotiator = \Config\Services::negotiator();
以上操作會獲取所有的請求實例并自動將其自動注入到 Negotiator (協(xié)商,下同)類中。
該類并不需要主動加載。而是通過請求的 IncomingRequest
實例來進行范文。 盡管你并不能通過這一過程直接訪問該實例,你可以通過 negotiate()
方法來調用它的所有方法:
$request->negotiate('media', ['foo', 'bar']);
當通過該方法訪問實例時,第一個參數(shù)是你需要匹配的內容的類型,第二個是所支持的類型值構成的數(shù)組。
本節(jié)中,我們將討論四種可以用來協(xié)商的類型,并展示如何通過上述兩種方法來進行內容協(xié)商。
第一層首先要看的就是媒體協(xié)商。該協(xié)商方式是通過 Accept
請求頭進行的,并且是可用的請求頭中最為復雜的類型之一。 一個常見的例子就是客戶端告訴服務端其所需要的數(shù)據(jù)格式,而這種操作在 API 中最為常見。例如,一個客戶端可能從一個 API 終點請求 JSON 編碼的數(shù)據(jù):
GET /foo HTTP/1.1
Accept: application/json
該服務器需要提供一個所支持的該內容的類型列表。在本例中,API 可能需要返回像原生 HTML ,JSON 或者是 XML 格式的數(shù)據(jù)。而根據(jù)客戶端偏好,該列表應順序返回:
$supported = [
'application/json',
'text/html',
'application/xml'
];
$format = $request->negotiate('media', $supported);
// 或者是
$format = $negotiate->media($supported);
在本例中,客戶端和服務器協(xié)商一致,將數(shù)據(jù)以 JSON 的格式返回,因此 ‘json’ 就會從協(xié)商方法中返回。默認情況下,如果沒有匹配到,在 $support
數(shù)組中的第一個成員就會返回。 盡管在某些情況下,你可能會強制要求服務端進行嚴格匹配格式。因此如果你將 true
作為最后參數(shù)傳入時,在匹配不到時就會返回空字符串:
$format = $request->negotiate('media', $supported, true);
// 或
$format = $negotiate->media($supported, true);
另一個常見的用法就是用于決定需要返回的內容的語言。如果你運行的是一個單語言網(wǎng)站,該功能顯然并沒有什么影響。 但是如果對于那些提供多語言內容的網(wǎng)站來說,該功能就會變得非常有用,基于瀏覽器將通常會在 Accept-Language
請求頭中發(fā)送偏好的語言類型:
GET /foo HTTP/1.1
Accept-Language: fr; q=1.0, en; q=0.5
本例中,瀏覽器偏好法語,并次偏好英語。如果你的網(wǎng)站支持英語或德語,那么你就會如下操作:
$supported = [
'en',
'de'
];
$lang = $request->negotiate('language', $supported);
// 或
$lang = $negotiate->language($supported);
本例中,”en”將作為當前語言返回。如果沒有產生匹配,就會返回 $supported
數(shù)組的第一個成員,因此該成員將會一直作為偏好語言。
Accept-Encoding
請求頭包含了客戶端所期望接收到的字符集,用于確定客戶端支持哪種類型的壓縮方式:
GET /foo HTTP/1.1
Accept-Encoding: compress, gzip
你的 web 服務器將會定義可以使用的壓縮類型。某些服務器,例如 Apache , 只支持了 gzip
$type = $request->negotiate('encoding', ['gzip']);
// 或
$type = $negotiate->encoding(['gzip']);
更多信息,參閱 Wikipedia.
所期待的字符集類型會通過 Accept-Charset
請求頭來傳值:
GET /foo HTTP/1.1
Accept-Charset: utf-16, utf-8
默認情況下,如果沒有匹配的話就會返回 utf-8
$charset = $request->negotiate('charset', ['utf-8']);
// 或者是
$charset = $negotiate->charset(['utf-8']);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: