Spring4 HttpMessageConverter

Spring 客製化HttpMessageConverter

江直穎 2017/12/29 15:11:42
1538

Spring 客製化HttpMessageConverter


簡介

簡單介紹Spring HttpMessageConverter 訊息轉換器, 並透過範例,提供客製化資料格式的請求與回應

作者

江直穎


 

1.   簡介

現在越來越多專案會導入SpringMVC搭建Restful環境架構需求,然而大部分的Restful 服務在資料請求與回應方式皆使用JSON or XML 等此類與前端溝通較為普遍且方便的資料格式。

然而 Spring提供了一個簡單的訊息轉換器:HttpMessageConverter  ,它讓開發者在HTTP傳輸過程中來針對Java物件來編組(marshall)與解組(unmarshall) 來讓資料處理讓程式端的開發更加快速、方便。

Spring官方也提供許多預設類別,並提供如何實作客製化的方法,本文章透過以下範例,簡單地介紹客製化 HttpMessageConverter 使用方式

 
  2.        目的
 
  • 初步了解Spring 客製化 HttpMessageConverter 實作使用方式
  • 簡單建立Spring restful 服務示範實作結果
 
  3.        開始前準備
 
本架構建立於以下版本的環境:
 
  • JDK 8
  • Spring 4.3.10
  • IDE使用 Eclipse Mars.1 Release (4.5.1)
  • 測試工具使用Firefox RESTClient
 
  4.        程式範例
 
4.1、 首先建構一個SpringRestfulServer部分實作,本範例使用Eclipse建立專案:
          建立Dynamic Web Project
 
  4.2、 因為本範例需引用Spring相關Library,所以我們在這轉換成Maven專案
 
 
  4.3、 定義pom.xml檔案,這邊需引用Spring webmvc 版本4.3.10相關Library
 
 
   4.4、 關於HttpMessageConvert Interface 檔案,我們可以發現Spring 將其歸類於 web Library部分
           檔案路徑位於 org.springframework.http.converter. HttpMessageConverter.class
        此介面提供了5個需要被實作的方法:
 
       canRead:判斷該轉換器是否能將請求內容轉換成Java Object 
       canWrite:判斷該轉換器是否可以將Java Object轉換成返回內容 
       getSupportedMediaTypes:獲得該轉換器支援的MediaType
       read:讀取請求內容並轉換成Java Object
       write:將Java Object轉換後寫入返回內容 
       其中read和write方法的參數分別有HttpInputMessage和HttpOutputMessage對象,
       這兩個對象分別代表著一次Http通訊中的request/response部分,可以通過getBody方法獲得對應的輸入和輸出串流
 
 
 
4.5、 客製化部分我們可以直接實作HttpMessageConvert 這個介面
         或是建議可以繼承AbstractHttpMessageConverter.class 這個官方已經實作部分方法的抽象類別
      如下圖,程式內有多一些基本的宣告(如log、mediaType、charset等屬性)並已經提供實作介面的方法
 
 
4.6、 本篇文章將示範假設一個Http的請求,其Content-Type為 "text/book"
         資料的傳遞透過客製化HttpMessageConvert 將對服務的請求/回應資料流轉換成名為 Book 的物件
         首先建立Book.java
 
 
 4.7、 新增BookConverter.java 繼承並實作AbstractHttpMessageConverter
          下圖可以發現,在建構BookConverter物件時,我們加入了一個MediaType:text/book
          並且實作supports、readInternalwriteInternal 三個方法
      其中 readInternal 方法將HttpInputMessage請求內容轉換成Book物件
                 writeInternal  方法將 HttpOutputMessage 回應內容轉換成Book物件
 
 
4.8、 新增BookInfoController.java 並定義兩個method處理input & output資料
         其中 saveBook method 處理@RequestBody 為Book的物件,並暫存在List裡
         而 findBookById method Book的物件透過@ResponseBody 回應並印出查詢該物件內資料內容
 
 
 
4.9、 本範例使用Spring 4.x 版本開發風格
         透過Annotation方式配置相關設定,而不使用Spring 相關xml配置
         新增一個繼承WebMvcConfigurerAdapter的檔案 AppConfig.java
         override   extendMessageConverters方法
     並將先前步驟客製化HttpMessageConverter  BookConverter 檔案,加入List中
 
 
4.10、 接著新增一個 透過繼承 AbstractAnnotationConfigDispatcherServletInitializer 的檔案 AppInitializer.java
      配置Spring DispatcherServlet 達到如同web.xml的設定
 
 
  4.11、 最後啟動tomcat server成功,Controller 內的RequestMapping 內容也建立完成
 
 
4.12、 使用Firefox plugin程式 RESTClient 測試看看吧:
           透過POST方式向服務端送出請求,將表單資料暫存成Book物件放置於服務端
           使用URL=> http://localhost:8080/SpringRestfulServer/saveBook 發送請求
           其中需定義HttpHeader 的 Content-Type 為 "text/book"
           因為有設定@ResponseBody的關係,所以這邊結果會 回傳Book 物件並印出資料內容
 
 
 4.13、 透過GET方式向服務端請求查詢 BookId 為1的資料
             使用URL=> http://localhost:8080/SpringRestfulServer/ findBookById /1  發送請求
            這邊也是因為設定@ResponseBody的關係,回傳結果即為剛才暫存的Id=1 的Book物件內容
 
然而回傳結果Response Header部分顯示的Content-Type 為text/book 
江直穎