一、Content-Type定義
Content-Type
MediaType,即是Internet Media Type,互聯網媒體類型;也叫做MIME類型,在Http協議消息頭中,使用Content-Type來表示具體請求中的媒體類型信息。
- 類型格式:type/subtype(;parameter)? type
- 主類型,任意的字符串,如text,如果是*號代表所有;
- subtype 子類型,任意的字符串,如html,如果是*號代表所有;
- parameter 可選,一些參數,如Accept請求頭的q參數, Content-Type的 charset參數。
例如: Content-Type: text/html;charset:utf-8;
常見的媒體格式類型如下:
- text/html : HTML格式
- text/plain :純文本格式
- text/xml : XML格式
- image/gif :gif圖片格式
- image/jpeg :jpg圖片格式
- image/png:png圖片格式
以application開頭的媒體格式類型:
- application/xhtml+xml :XHTML格式
- application/xml : XML數據格式
- application/atom+xml :Atom XML聚合格式
- application/json : JSON數據格式
- application/pdf :pdf格式
- application/msword : Word文檔格式
- application/octet-stream : 二進制流數據(如常見的文件下載)
- application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數據被編碼為key/value格式發送到服務器(表單默認的提交數據的格式)
另外一種常見的媒體格式是上傳文件之時使用的:
- multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式
以上就是我們在日常的開發中,經常會用到的若干content-type的內容格式。
在客戶端發起請求到服務器端收到請求處理完畢返回信息再到客戶端收到反饋,過程為:
- 首先,客戶端構造了一個HttpRequest,里面包含了需要提交到服務器端的數據,客戶端提交該HtteRequest(比如通過HttpClient對象提交)。
- 接着,服務器端收到此請求,在服務器端對應的對象為HttpServletRequest
- 然后,服務器端根據請求處理后,生成了一個HttpServletResponse,返回給客戶端
- 客戶端展現服務器端返回的數據
清楚了這幾個環節,自然也就可以得知,我們熟悉的HttpServletRequest和HttpServletResponse是服務器端的對象,而HttpRequest是客戶端的對象,切不可搞混。他們的Content-Type都遵循RFC2616中定義的規范,但對於不同的對象,他們的Content-Type是不同的,例如,對於HttpRequest/HttpServletRequest對象,在最常見的表單提交中,Content-Type通常是application/x-www-form-urlencoded或multipart/form-data,前者通常用於沒有附件上傳的表單,后者通常用於需要上傳附件的表單,詳閱RFC1867;而HttpServletResponse的Content-Type通常是text/html、application/json等。
二、Servlet端對不同請求內容的處理
當Content-Type的值為application/x-www-form-urlencoded時(html的form表單enctype默認值是application/x-www-form-urlencoded,會將表單數據用&符號做一個簡單的拼接傳到后台),在servlet后台可通過request.getParameter()獲取表單內容數據,當請求為其它類型時后台serlvet中需要通過request.getInputStream()或request.getReader()才能獲取到數據。
三、Spring MVC中對於Content-Type的處理
Spring MVC中關於關於Content-Type類型信息的使用
首先我們來看看RequestMapping中的Class定義:
- @Target({ElementType.METHOD, ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Mapping
- public @interface RequestMapping {
- String[] value() default {};
- RequestMethod[] method() default {};
- String[] params() default {};
- String[] headers() default {};
- String[] consumes() default {};
- String[] produces() default {};
- }
value: 指定請求的實際地址, 比如 /action/info之類。
method: 指定請求的method類型, GET、POST、PUT、DELETE等
consumes: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回
params: 指定request中必須包含某些參數值是,才讓該方法處理
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求
其中,consumes, produces使用content-typ信息進行過濾信息;headers中可以使用content-type進行過濾和判斷。
@RequestMapping(value = "/consumes", consumes = {"application/json"}):此處使用consumes來指定功能處理方法能消費的媒體類型,其通過請求頭的“Content-Type”來判斷。
@RequestMapping(value = "/produces", produces = "application/json"):表示將功能處理方法將生產json格式的數據,此時根據請求頭中的Accept進行匹配,如請求頭“Accept:application/json”時即可匹配;