@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