HTTP CIer CodeIgniter 4 接受 Chrome Mozilla HTTP 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/p,//; q=0.8接受編碼:gzip、deflate、sdcha"/> HTTP CIer CodeIgniter 4 接受 Chrome Mozilla HTTP 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/p,//; q=0.8接受編碼:gzip、deflate、sdcha">

首頁  >  文章  >  後端開發  >  CodeIgniter 4 的內容協商 codeigniter session codeigniter join nginx codeigniter rewrite

CodeIgniter 4 的內容協商 codeigniter session codeigniter join nginx codeigniter rewrite

WBOY
WBOY原創
2016-07-29 08:54:42976瀏覽

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

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教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn