springMVC produces屬性含義


@RequestMapping(value = "/produces", produces = "application/json"):表示將功能處理方法將生產json格式的數據,此時根據請求頭中的Accept進行匹配,如請求頭“Accept:application/json”時即可匹配;

@RequestMapping(value = "/produces", produces = "application/xml"):表示將功能處理方法將生產xml格式的數據,此時根據請求頭中的Accept進行匹配,如請求頭“Accept:application/xml”時即可匹配。

此種方式相對使用@RequestMapping的“headers = "Accept=application/json"”更能表明你的目的。

服務器控制器代碼詳解cn.javass.chapter6.web.controller.consumesproduces.ProducesController;

客戶端代碼類似於之前的Content-Type中的客戶端,詳見ProducesController.java代碼。

當你有如下Accept頭:

①Accept:text/html,application/xml,application/json

      將按照如下順序進行produces的匹配 ①text/html ②application/xml ③application/json

②Accept:application/xml;q=0.5,application/json;q=0.9,text/html

      將按照如下順序進行produces的匹配 ①text/html ②application/json ③application/xml

      q參數為媒體類型的質量因子,越大則優先權越高(從0到1)

③Accept:*/*,text/*,text/html

      將按照如下順序進行produces的匹配 ①text/html ②text/* ③*/*

 

即匹配規則為:最明確的優先匹配。

代碼詳見ProducesPrecedenceController1、ProducesPrecedenceController2、ProducesPrecedenceController3。

Accept詳細信息,請參考http://tools.ietf.org/html/rfc2616#section-14.1

三、窄化時是覆蓋 而 非繼承

如類級別的映射為 @RequestMapping(value="/narrow", produces="text/html"),方法級別的為@RequestMapping(produces="application/xml"),此時方法級別的映射將覆蓋類級別的,因此請求頭“Accept:application/xml”是成功的,而“text/html”將報406錯誤碼,表示不支持的請求媒體類型。

詳見cn.javass.chapter6.web.controller.consumesproduces.NarrowController。

只有生產者/消費者 模式 是 覆蓋,其他的使用方法是繼承,如headers、params等都是繼承。

四、組合使用是“或”的關系

@RequestMapping(produces={"text/html", "application/json"}) :將匹配“Accept:text/html”或“Accept:application/json”。

五、問題

消費的數據,如JSON數據、XML數據都是由我們讀取請求的InputStream並根據需要自己轉換為相應的模型數據,比較麻煩;

生產的數據,如JSON數據、XML數據都是由我們自己先把模型數據轉換為json/xml等數據,然后輸出響應流,也是比較麻煩的。

Spring提供了一組注解(@RequestBody、@ResponseBody)和一組轉換類(HttpMessageConverter)來完成我們遇到的問題,詳見6.6.8節。

 

https://blog.csdn.net/lzwglory/article/details/17252099


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM