SpringMVC 中HttpMessageConverter簡介和Http請求415 Unsupported Media Type的問題

1、概述:
   本文介紹且記錄如何解決在SpringMVC 中遇到 415  Unsupported Media Type 的問題,而且順便介紹Spring MVC的HTTP請求信息轉換器 HttpMessageConverter
 
2、問題描述:
   在SprinvMVC的Web程序中,我在頁面發送Ajax 的POST請求,而後在服務器端利用@requestBody接收請求body中的參數,當時運行過程當中,我想服務器發送Ajax請求,瀏覽器一直反饋415  Unsupported Media Type或者 400的狀態碼,覺得是Ajax寫的有問題。便查找了半天資料, 才發現spring-mvc.config文件的配置中少了東西,固然也有多是你真的在Ajax中缺乏了對Content-Type參數的設置。分析後應該是我springMVC-config.xml文件配置有問題。
(注):400:(錯誤請求) 服務器不理解請求的語法。 415:(不支持的媒體類型) 請求的格式不受請求頁面的支持。
 
3、解決方法:  
  在springMVC-config.xml文件中, 增長了一個StringHttpMessageConverter請求信息轉換器,配置片斷以下:
<!--- StringHttpMessageConverter bean -->
< bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/>

<!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 -->
< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
       < property name= "messageConverters" >
             < list>
                 < ref bean= "mappingJacksonHttpMessageConverter" />
                 <!-- 新增的StringMessageConverter bean-->
                 < ref bean= "stringHttpMessageConverter" />
                 < ref bean= "jsonHttpMessageConverter" />           
                 < ref bean= "formHttpMessageConverter" />
             </ list>
        </ property>
</ bean>

 

4、HttpMessageConverter請求信息轉換器簡介:html

  HttpMessageConverter 接口 指定了一個能夠把Http request信息和Http response信息進行格式轉換的轉換器。一般實現HttpMessageConverter接口的轉換器有如下幾種:
  1. ByteArrayHttpMessageConverter: 負責讀取二進制格式的數據和寫出二進制格式的數據;
  2. StringHttpMessageConverter:   負責讀取字符串格式的數據和寫出二進制格式的數據;
  3.  ResourceHttpMessageConverter:負責讀取資源文件和寫出資源文件數據; 
  4. FormHttpMessageConverter:       負責讀取form提交的數據(能讀取的數據格式爲 application/x-www-form-urlencoded,不能讀取multipart/form-data格式數據);負責寫入application/x-www-from-urlencoded和multipart/form-data格式的數據;
  5. MappingJacksonHttpMessageConverter:  負責讀取和寫入json格式的數據;
  6. SourceHttpMessageConverter:                   負責讀取和寫入 xml 中javax.xml.transform.Source定義的數據;
  7. Jaxb2RootElementHttpMessageConverter:  負責讀取和寫入xml 標籤格式的數據;
  8. AtomFeedHttpMessageConverter:              負責讀取和寫入Atom格式的數據;
  9. RssChannelHttpMessageConverter:           負責讀取和寫入RSS格式的數據;
 
5、HttpMessageConverter請求信息轉換器執行流程:
   當用戶發送請求後,@Requestbody 註解會讀取請求body中的數據,默認的請求轉換器 HttpMessageConverter經過獲取請求頭Header中的Content-Type來確認請求頭的數據格式,從而來爲請求數據適配合適的轉換器。例如contentType:applicatin/json,那麼轉換器會適配MappingJacksonHttpMessageConverter響應時候的時候同理,@Responsebody註解會啓用HttpMessageConverter,經過檢測Header中Accept屬性來適配的響應的轉換器。
 
總結:
  當在使用SpringMVC作服務器數據接收時,尤爲是在作Ajax請求的時候,尤爲要注意contentType屬性,和accepte 屬性的設置,在springmvc-config.xml中配置好相應的轉換器。當咱們在用SpringMVC作 Ajax 請求的時候,有的作法用response.getWriter().print()的方法,還有更好的方法就是添加@Responsebody註解,直接返回Map類型的數據,轉換器自動轉換爲JSON數據類型。
相關文章
相關標籤/搜索