解析yii2內建響應協商行為類 - ContentNegotiator

阿北哥ya發表於2017-09-09

通過分析Request的header來返回對應的資料格式。

在開始之前我們先說一下yii2的Response類內建都可以返回什麼型別的響應格式,一共5種,當然你也可以自定義其他的。

  • FORMAT_RAW
  • FORMAT_HTML
  • FORMAT_JSON
  • FORMAT_JSONP
  • FORMAT_XML

在我們響應瀏覽器的時候可以設定如上的格式。

ContentNegotiator是幹嘛的?它可以分析Request的header然後指派所需的響應格式給客戶端,不需要我們人工指定,當然它也是action的篩選器,比如ContentNegotiator限定了只能返回FORMAT_JSON,則就算客戶端請求一個xml格式的資料,也徒勞。

一般ContentNegotiator都是作為action篩選器使用,看它的層級關係一目瞭然。

alt
alt

它是篩選器,它也是行為。

一個例子

有一個控制器叫做NegController,它有兩個action,我希望都返回json型別的資料,則可以這樣配置。

alt
alt

就是繫結了一個行為,通過配置ContentNegotiator的formats可以限定返回的型別,並且可以指定只是針對於index和list有效,當然如果你只想剔除某個action,可以使用except引數。

接下來我們看看actionIndex,我們其實返回了一個結果集。看看瀏覽器端的表現。

alt
alt

大家看到了,忽略了Request對響應格式的說明,並且將結果集轉換成json格式直接返回。

當然我們可以指定多種,這樣yii2會根據Request中header的accept欄位進行分析。比如下圖

alt
alt

比如我設定我想接收json型別的資料,則ContentNegotiator會對其進行匹配。

alt
alt

這是第一種方法,我們可以針對於一個控制器進行篩選和內容協商,另外我們可以針對於整個yii2程式進行協商,比如你的程式是手機應用的介面後臺,全部需要json格式。

全域性協商

就是上面的需求,我們可以在配置檔案裡進行處理 config/web.php,因為ContentNegotiator要在action之前分析過來的請求頭,因此對於全域性設定,我們需要放到web.php的bootstrap進行預載入。

alt
alt

簡單的設定一下,整個程式都返回json格式了。

RESTful

針對於普通程式可能這種響應格式統一化還不明顯,不過針對於比如app就很重要了,或是統一返回xml、或是json,他們代表純資料。

在yii2的RESTful模組中,ContentNegotiator也起到了重要作用並且貫穿於所有的控制器。

我們都知道對於RESTful,每個控制器需要繼承ActiveController,而ActiveController又是yii\rest\Controller的子類。在yii\rest\Controller中我們發現瞭如下程式碼。

alt
alt

你明白了吧,也就是說所有的RESTful下的action都返回xml或json格式的資料,具體是誰可以根據請求header來。關於這點,我們在開發RESTful程式時候要特別注意。

當然不僅僅如此,ContentNegotiator還可以根據語言進行協商並返回對應的資料,感興趣的夥伴可以自行研究下,思路差不多。


簽名檔
簽名檔

相關文章