成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個SpringMVC接口能返回JSON又能返回XML? 安排!

開發 后端
我們有一個接口服務為下游的系統提供數據服務,本來好好的大家都愉快地傳遞JSON,非常和諧。可最近有個新需求去對接一個很老的系統,這倒是不算啥,可這個老系統數據不是以JSON傳遞的而是以XML傳遞的。

[[420572]]

我們有一個接口服務為下游的系統提供數據服務,本來好好的大家都愉快地傳遞JSON,非常和諧。可最近有個新需求去對接一個很老的系統,這倒是不算啥,可這個老系統數據不是以JSON傳遞的而是以XML傳遞的。

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

原理

在HTTP協議里,當客戶端發起一個HTTP請求時,可以攜帶一個請求頭Accept來告訴服務端,客戶端可以接受哪些響應類型(MIME),可以是一個也可以是多個。現在前后端分離普遍使用這種:

  1. Accept:application/json 

對于Spring MVC框架來說接受到對應的Accept會根據一定的策略找到對應的HttpMessageConverter來處理響應數據的格式。因此我們只需要找到一個動態指定Accept的方法就行了。

內容協商

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

Spring MVC版本基于Spring MVC 5.3.9。

服務端配置內容協商

內容協商的配置由Spring MVC中的ContentNegotiationManager負責,我們可以通過ContentNegotiationConfigurer配置它。

首先要在Spring MVC項目中加入Jackson的XML處理庫:

  1. <dependency> 
  2.             <groupId>com.fasterxml.jackson.dataformat</groupId> 
  3.             <artifactId>jackson-dataformat-xml</artifactId> 
  4.         </dependency> 

 

然后配置WebMvcConfigurer中的內容協商配置:

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

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

  1. https://yourapi?format=json 

你也可以不攜帶format參數,因為默認就是JSON,修改默認的MIME類型需要調用defaultContentType。

如果你需要返回XML:

  1. https://yourapi?format=xml 

服務端的接口也需要簡單的改造:

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

需要根據配置在@RequestMapping或其簡化注解中聲明對應的produce,這一點非常重要。這樣我們改動的地方就非常的少了,能夠適應更多的場景,而且維護起來也很簡單。

其它策略

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

本文轉載自微信公眾號「碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯系碼農小胖哥公眾號。

 

責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2015-02-11 15:06:41

微信SDK

2009-07-23 10:51:20

jQuery調用Web返回JSON數據

2022-06-20 08:37:28

接口tokenAO

2011-05-25 15:34:17

jQueryJSON

2021-07-15 08:58:16

Spring對象引用

2009-09-24 17:09:03

XML設計器

2021-08-23 15:14:09

Linuxat命令任務

2019-09-29 10:23:09

APIJava編程語言

2025-03-05 00:00:00

2009-12-04 13:50:00

PHP服務端返回Jso

2010-01-08 09:03:38

返回JSON數據

2024-11-25 08:14:09

Gin框架格式

2025-03-05 07:00:00

渲染state開發

2023-06-29 08:43:44

DNS解析IP

2010-09-09 10:42:30

SQL函數時間

2024-01-26 11:08:57

C++函數返回不同類型

2009-08-26 15:53:42

C#數據訪問XML

2022-07-28 09:16:42

JMeter接口

2020-09-22 07:50:23

API接口業務

2012-05-08 13:14:05

JavaComparable
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕观看 | 国产精品欧美一区二区 | 国产精品综合一区二区 | 亚洲精品乱码久久久久久黑人 | 午夜精品视频在线观看 | 欧美激情精品久久久久久免费 | 久久精品日产第一区二区三区 | 亚洲成人精选 | 日韩一区二区不卡 | 福利片在线 | 中文字幕av高清 | 亚洲国产成人精品女人久久久 | 亚洲精品电影网在线观看 | 精品视频久久久久久 | 日韩欧美亚洲 | 国产乱码精品一区二区三区中文 | 亚洲精品国产成人 | 日韩中文字幕一区二区 | 4hu最新网址 | www97影院 | 中文字幕国产高清 | 成人国产精品入口免费视频 | 午夜视频一区 | 国产中的精品av涩差av | 久久精品国产一区 | 国产精品国产自产拍高清 | 欧美精品乱码99久久影院 | www.久久久久久久久久久久 | 91在线一区 | 日本在线视频不卡 | 亚洲综合在线网 | 亚洲欧美日韩国产 | 又爽又黄axxx片免费观看 | 国产一区二区久久久 | 秋霞性生活| 亚洲看片网站 | 国产一区在线免费 | 女女百合av大片一区二区三区九县 | 欧美一区二区三区四区在线 | 秋霞电影一区二区三区 | 亚洲精品成人 |