SpringMVC:各種媒體類型處理方式及應(yīng)用場景

本文簡單介紹HTTP MediaType在Spring MVC中的處理方式,并通過實際項目場景加以分析。



Http請求中的ContentType與Accept

在HTTP協(xié)議中,ContentType用于向服務(wù)器描述客戶端請求報文媒體類型,Accept用于描述客戶端希望接收到的返回報文媒體類型。

ContentType與Accept在AJAX請求中格式如下:

$.ajax({

url: url,

type:"POST",

cache: false,

data:jsonDataStr,

dataType:"json",

contentType:"application/json",

headers: {"Accept":"application/json"},

success: function(data)

{

//todo:data為處理返回的數(shù)據(jù),為json對象

},error: function() {

}


對應(yīng)HTTP請求中表現(xiàn)形式如下:

Accept:application/json

Content-Type:application/json


SpringMVC常用Converter

在spring-web.jar中,定義了處理各種常見MediaType的Converter:

FormHttpMessageConverter:默認(rèn)處理application/x-www-form-urlencoded及multipart/form-data媒體類型。

MappingJackson2HttpMessageConverter:默認(rèn)處理application/json媒體類型,Spring3.1.2版本后從jackson1.X版本升級為jackson2.X版本。

StringHttpMessageConverter:默認(rèn)處理所有未設(shè)置ContentType的請求。

ByteArrayHttpMessageConverter:默認(rèn)處理application/octet-stream類型請求。

需要自定義媒體類型時,可以在SpringMVC配置文件中進(jìn)行配置:

<bean class="org.springframework.web.servlet.mvc.method.annotation.

RequestMappingHandlerAdapter">

<property name="messageConverters">

<list>
<!--在此添加需要使用的converter,添加后原有默認(rèn)的converter將不再可用。>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="jsonConverter"? class="org.springframework.http.converter.json.
MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
<!--自定義處理MediaType-->
<value>text/json</value>
</list>
</property>
</bean>


Spring選擇Converter的優(yōu)先級如下:

1、請求中的ContentType和Accept對應(yīng)的Converter

2、如果1無法找到對應(yīng)Converter,則通過遍歷MessageConverters的canRead/canWrite選擇最有可能的Converter

3、如果2無法找到對應(yīng)Converter,則返回錯誤。

常見媒體類型使用場景

application/x-www-form-urlencoded

在HTML中,該媒體類型為form表單提交默認(rèn)的媒體類型,在請求BODY中,對象以URLEncoded的格式進(jìn)行序列化,序列化后屬性與值之間通過“=”進(jìn)行鍵值匹配,屬性之間通過“&”進(jìn)行分割。

示例代碼:

<form action="targetUrl" method="post">

<input type="text" name="userName"/>

<input type="text" name="password"/>

<input type="submit"/>

</form>

提交后BODY數(shù)據(jù):

userName=admin&password=b59c67bf196a4758191e42f76670ceba

Spring Controller通過Method的入?yún)⒒蛘遰equest.getParameter獲取傳入?yún)?shù)。

@RequestMapping(value="/login")

public String login(HttpServletRequest request,HttpServletResponse response,

String userName,String password){

request.getParameter("userName");

request.getParameter("password");

return null;

}

multipart/form-data

在HTML中,該媒體類型用于處理包含文件流的表單請求。頁面示例如下:

<form action="targetUrl" method="post" enctype="multipart/form-data">

<input type="file" name="uploade/>
<input type="submit"/>

</form>

提交后BODY數(shù)據(jù)(文件字節(jié)流無顯示):

------WebKitFormBoundaryzFUmkVY8xZakacAp

Content-Disposition: form-data; name="upload"; filename="0_1474424040152845.jpg"

Content-Type: image/jpeg

------WebKitFormBoundaryzFUmkVY8xZakacAp--

Spring Controller中通過MultipartFile對象接收處理請求:

@RequestMapping(value = "/upload")?

public String upload(HttpServletRequest request,HttpServletResponse response,MultipartFile upload){

//TODO:文件上傳

return null;}

上傳多個文件時,通過MulTipartFile數(shù)組進(jìn)行處理。

application/json

application/json對應(yīng)JSON格式數(shù)據(jù),常用與AJAX請求與HTTP REST風(fēng)格服務(wù)接口中。

請求中ContentType與Accept定義為application/json,Controller中通過ResponseBody進(jìn)行返回。

請求:

var? user={"name":"fisher","mark":"fisher demo"}

var jsonDataStr=JSON.stringify(user);

$.ajax({

url: url,

type:"POST",

cache: false,

data:jsonDataStr,

dataType:"json",

contentType:"application/json",

headers: {"Accept":"application/json"},

success: function(data)

{

if(data.code==1){

alert(data.message);

}


//todo:data為處理返回的數(shù)據(jù),為json對象

},error: function() {

}

后臺處理:

@RequestMapping(value = "/jsonhandle", method = RequestMethod.POST)

public @ResponseBody Map<String,Object> jsonHandle(User user){

?????? Map<String,Object> result=new HashMap<String,Object>();

????? result.put("code",1);

????? result.put("message","this is a test");

????? return result;

}


Jquery Ajax中的dataType

當(dāng)Jquery Ajax中dataType為text時,則Accept為application/json的請求會保留為純文本字符,而不會生成JavaScript對象。

參考:w3school

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容