日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一個(gè)SpringMVC接口能返回JSON又能返回XML?安排!

我們有一個(gè)接口服務(wù)為下游的系統(tǒng)提供數(shù)據(jù)服務(wù),本來好好的大家都愉快地傳遞JSON,非常和諧??勺罱袀€(gè)新需求去對(duì)接一個(gè)很老的系統(tǒng),這倒是不算啥,可這個(gè)老系統(tǒng)數(shù)據(jù)不是以JSON傳遞的而是以XML傳遞的。

同事小王想了個(gè)餿主意,把原來的接口原版拷貝一遍統(tǒng)一把返回類型改成XML不就行了?嗯,接口路徑需要占用一套,權(quán)限配置多了一套,還要額外維護(hù)一套代碼,這主意太餿了。經(jīng)過大家的研究發(fā)現(xiàn)了Spring MVC的某個(gè)機(jī)制可以滿足需求。

原理

在HTTP協(xié)議里,當(dāng)客戶端發(fā)起一個(gè)HTTP請求時(shí),可以攜帶一個(gè)請求頭Accept來告訴服務(wù)端,客戶端可以接受哪些響應(yīng)類型(MIME),可以是一個(gè)也可以是多個(gè)?,F(xiàn)在前后端分離普遍使用這種:

 
 
 
 
  1. Accept:application/json

對(duì)于Spring MVC框架來說接受到對(duì)應(yīng)的Accept會(huì)根據(jù)一定的策略找到對(duì)應(yīng)的HttpMessageConverter來處理響應(yīng)數(shù)據(jù)的格式。因此我們只需要找到一個(gè)動(dòng)態(tài)指定Accept的方法就行了。

內(nèi)容協(xié)商

聽起來就很好理解,需要什么內(nèi)容大家協(xié)商,共同解決問題。Spring MVC提供了一種被稱作內(nèi)容協(xié)商的機(jī)制,客戶端在請求時(shí)聲明需要的MIME類型,服務(wù)端只需要配置一些策略就是實(shí)現(xiàn)一個(gè)接口返回不同MIME類型的數(shù)據(jù)格式,想要JSON返回JSON,想要XML返回XML。

Spring MVC版本基于Spring MVC 5.3.9。

服務(wù)端配置內(nèi)容協(xié)商

內(nèi)容協(xié)商的配置由Spring MVC中的ContentNegotiationManager負(fù)責(zé),我們可以通過ContentNegotiationConfigurer配置它。

首先要在Spring MVC項(xiàng)目中加入Jackson的XML處理庫:

 
 
 
 
  1.             com.fasterxml.jackson.dataformat
  2.             jackson-dataformat-xml
  3.         

然后配置WebMvcConfigurer中的內(nèi)容協(xié)商配置:

 
 
 
 
  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3.     @Override
  4.     public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
  5.         configurer.favorParameter(true)
  6.                 // 客戶端請求url需要攜帶一個(gè)query參數(shù) 默認(rèn)名稱是 format
  7.                 .parameterName("format")
  8.                 // 如果不聲明 該query參數(shù) 返回的是json  如果你想指定默認(rèn)返回類型就需要聲明
  9.                 // .defaultContentType(MediaType.APPLICATION_XML)
  10.                 .mediaType("xml", MediaType.APPLICATION_XML)
  11.                 .mediaType("json", MediaType.APPLICATION_JSON);
  12.     }
  13. }

這樣聲明以后客戶端請求接口中要攜帶一個(gè)query參數(shù)(參數(shù)名稱默認(rèn)為format,你可以修改它)來指定MIME的代號(hào)。根據(jù)上面的配置,如果你需要返回JSON:

 
 
 
 
  1. https://yourapi?format=json

你也可以不攜帶format參數(shù),因?yàn)槟J(rèn)就是JSON,修改默認(rèn)的MIME類型需要調(diào)用defaultContentType。

如果你需要返回XML:

 
 
 
 
  1. https://yourapi?format=xml

服務(wù)端的接口也需要簡單的改造:

 
 
 
 
  1. @GetMapping(value = "/get",produces = {"application/json","application/xml"})
  2. public Map doGet(@RequestParam String foo, String bar) {
  3.     Map map = new HashMap<>();
  4.     map.put("foo", foo);
  5.     map.put("bar", bar);
  6.     return map;
  7. }

需要根據(jù)配置在@RequestMapping或其簡化注解中聲明對(duì)應(yīng)的produce,這一點(diǎn)非常重要。這樣我們改動(dòng)的地方就非常的少了,能夠適應(yīng)更多的場景,而且維護(hù)起來也很簡單。

其它策略

其實(shí)Spring MVC的內(nèi)容協(xié)商還可以通過后綴擴(kuò)展名實(shí)現(xiàn),比如/yourapi.json或者/yourapi.xml。還有直接在客戶端請求頭中聲明MIME類型。這些都不太方便操作所以就不介紹了,有興趣可以去看官方文檔。

本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號(hào)。


網(wǎng)頁標(biāo)題:一個(gè)SpringMVC接口能返回JSON又能返回XML?安排!
新聞來源:http://www.5511xx.com/article/ccogpis.html