本文簡單介紹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