1. 简介

本文介绍使用SpringMVC的后端服务如何通过配置来支持多种返回值类型(xml,json,html,excel)

这里的代码使用的是springboot,下载地址:https://github.com/xiagn825/springboot-todolist/tree/springboot-ContentNegotiation

2. 基础概念

2.1 HttpHeader中Content-Type和Accept设置的区别

Accept:接口要返回给客户端的数据格式

curl --header 'Accept:application/json' http://localhost:8080/todo

Content-Type:客户端发送给服务器端的数据格式

curl -X PUT --header 'Content-Type:application/json' -d '{"title":"周末日程","content":"睡觉"}' http://localhost:8080/todo

2.2 SpringMVC生成输出的两种方式

1) 当服务端使用Restful的方式,只为客户端的ajax或其他服务端请求提供数据时,通常会使用@ResponseBody来标识你的返回,这时候Spring使用HttpMessageConverter来把返回的对象格式化成所需的格式。

2) 当你需要提供表现层(比如:HTML),这时候SpringMVC使用ViewResolver来将处理你的返回。

有时候你的应用程序这两者都要提供

2.3 SpringMVC输出格式判定

很多时候为了支持多个系统或多个终端,你需要让相同的数据已不同的表现形式输出。

SpringMVC使用ContentNegotationStrategy来判定用户请求希望得到什么格式的数据。

ContentNegotationStrategy通过三种方式来识别用户想要返回什么样的数据

通过请求URL后缀:http://myserver/myapp/accounts/list.html 返回html格式

通过请求的参数:http://myserver/myapp/accounts/list?format=xls 该设置默认不开启,默认key是format。

通过HTTP Header的Accept:Accept:application/xml

优先级由上至下

请看如下配置

@Override

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

configurer.favorPathExtension(false)

.favorParameter(true)

.parameterName("mediaType")

.defaultContentType(MediaType.APPLICATION_JSON)

.mediaType("xml", MediaType.APPLICATION_XML)

.mediaType("html", MediaType.TEXT_HTML)

.mediaType("json", MediaType.APPLICATION_JSON);

}

在你工程的WebMvcConfig中加入以上配置,表示关闭URL后缀的规则,打开请求参数规则并设置请求参数为’mediaType’,默认的返回格式是json,还支持返回xml,html。

这三个组件是用来处理返回不同格式输出的关键

Request Mappings: 决定不同的请求到不同的方法并返回不同的格式.

View Resolution: 根据类型返回合适的表示层.

HttpMessageConverters: 将request中的参数转换成java对象,将java对象转换成相应的输出格式到response.

2.4 RequestMappings

2.4.1 RequestMappingHandlerMapping

我们在spring中通常使用的就是RequestMappingHandlerMapping,根据RequestMappingInfo,细化匹配条件,整体的查找过程如下:

AbstractHandlerMethodMapping实现接口getHandlerInternal

1. 使用UrlPathHelper查找request对应的path

2. 查找path对应的HandlerMethod

2.1 从urlMap中直接等值匹配查找匹配条件RequestMappingInfo

2.2 如果等值查找到匹配条件,将其添加到match条件中

2.3 如果没有找到匹配条件,使用所有的handlerMethod的RequestMappingInfo进行匹配

2.4 对匹配到的Match进行排序,取出最高优先级的Match,并核对是否是唯一的最高优先级

2.5 对匹配到条件,没有匹配到条件的两种情况,分别进行封装

3. 封装HandlerMethod,确保bean中存的是实例

ContentNegotiationManager其中提供了针对miniType的match条件比较,使框架可以匹配到最合适的处理方法。

2.5 HttpMessageConverter

2.5.1 The Default Message Converters

SpringMvc默认会加载下列HttpMessageConverters:

ByteArrayHttpMessageConverter – converts byte arrays

StringHttpMessageConverter – converts Strings

ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream

SourceHttpMessageConverter – converts javax.xml.transform.Source

FormHttpMessageConverter – converts form data to/from a MultiValueMap.

Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML (added only if JAXB2 is present on the classpath)

MappingJackson2HttpMessageConverter – converts JSON (added only if Jackson 2 is present on the classpath)

MappingJacksonHttpMessageConverter – converts JSON (added only if Jackson is present on the classpath)

AtomFeedHttpMessageConverter – converts Atom feeds (added only if Rome is present on the classpath)

RssChannelHttpMessageConverter – converts RSS feeds (added only if Rome is present on the classpath)

我们如果返回的是使用@ResponseBody来标识的,那么框架会使用HttpMessageConverter来处理返回值,默认的xmlCoverter不是特别好用,依赖返回实体对象上的@XmlRootElement注解,不是很方便所以引入辅助类库,并自定义MessageConverter这样可以直接将返回的对象处理成xml格式。

Gradle import library

compile group: 'org.springframework', name: 'spring-oxm', version: '4.3.9.RELEASE'

compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.10'

configuration

@Override

public void configureMessageConverters(List> converters) {

converters.add(createXmlHttpMessageConverter());

super.configureMessageConverters(converters);

}

private HttpMessageConverter createXmlHttpMessageConverter() {

MarshallingHttpMessageConverter xmlConverter =

new MarshallingHttpMessageConverter();

XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();

xmlConverter.setMarshaller(xstreamMarshaller);

xmlConverter.setUnmarshaller(xstreamMarshaller);

return xmlConverter;

}

2.6 View Resolution

2.6.1 页面render(freemarker)

当需要返回页面时就需要由合适的viewResolver来绘制画面,这里采用freemarker作为页面引擎。

Gradle import library

compile("org.springframework.boot:spring-boot-starter-freemarker")

rss spring 接口_spring 接口支持返回多种格式相关推荐

  1. 【SpringCloud】设置接口同时支持返回多种数据类型(json、xml)

    文章目录 一.业务场景 二.使用步骤 1.引入核心Jar包 2.定义一个测试接口 2.1.接口 2.2.实现接口 2.3.控制器定义接口 三.接口测试 1.请求返回json类型数据 2.请求返回xml ...

  2. 修复登录接口仿抽奖助手微信小程序源码下载-支持商家认证多种开奖方式

    本版本是已经修复登录接口的 支持商家认证带V 支持多种抽奖模式 支持多种开奖方式 导航自定义,首页福利推送自定义 更多功能具体自行研究 PS:导航路径需要自行添加 下面是小编测试演示图: 小程序源码下 ...

  3. java 扩展接口_详解常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  4. spring boot开发接口api

    spring boot开发接口api ​ 在上一次教了大家怎么去搭建一个自己的后端模板之后,现在和大家分享讨论一下如何开发RestfulApi接口. 首先开发api之前要考虑到后端是需要写api文档的 ...

  5. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  6. 基于springboot的支持http接口+dubbo接口的TestNG自动化测试框架

    一.背景 由于大多数公司都是使用Java作为后端开发语言,因此为了更好的与研发的框架对接.测试,掌握一套Java的自动化测试框架也逐渐成为测试人员的必修课. 同时随着现在微服务框架的流行,自动化测试框 ...

  7. 芋道 Spring Boot API 接口文档 Swagger 入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  8. java接口返回xml格式_xml格式接口数据编程实战

    系统对外提供接口,或者系统调用外部接口,常常会使用xml格式作为接口数据传输格式(json数据,txt文本数据亦可),下面讲讲xml数据的生成和解析. 首先讲讲xml数据生成,通常可以用两种方法,使用 ...

  9. java接口返回xml格式_Java xml数据格式返回实现操作

    前言:对于服务器后端开发,接口返回的数据格式一般要求都是json,但是也有使用xml格式 RequestBody注解 对于SpringMVC,很多人会认为接口方法使用@Controller搭配@Res ...

最新文章

  1. vue怎么vw布局好用_vue 实现 rem 布局的 或者 vw 布局的方法
  2. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
  3. 神经网络的梯度消失和过拟合产生原因及其解决方案
  4. GDB调试程序系列 (3)
  5. JDK6u25里添加的按线程统计分配内存量: JMX
  6. c#随机数的产生与输出【C#】
  7. 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...
  8. 【Kafka】Kafka 奇怪问题之无法用Java 客户端消费
  9. centos屏幕视频录制,转换
  10. Atitit snownlp nlp 常见功能 目录 1.1. 主要功能: 1 1.2. 官网信息: 2 1.3. # 自动摘要 vs 关键词提取 2 1.4. Tf idf算法 2 1.5. p
  11. Eclipse_设置JSP模板
  12. 苹果6S怎么录屏_苹果6s来电没声音怎么回事
  13. 搜索引擎(二)网页排名算法(1)PageRank
  14. SharePoint 2013 开发中JavaScript本地化方案
  15. 二手房交易有哪些税费?
  16. 求两个圆公切线的模板
  17. JMeter性能测试,入门到入土
  18. html导航图片滚动条,CSS实现导航栏底部动态滚动条效果
  19. 【android】Notification 和 Service的结合应用以及Notification在Android8.0之后的坑 Bad notification
  20. 硬盘分区按照1G=1024M换算分区后不是整数(想分10G,分区时填入大小102400M.但是分区完毕显示却是99.9G或近似值9.XXG,而不是10G整)。本篇为这个问题的原理分析和解决办法

热门文章

  1. SAP Fiori Launchpad的后台配置路径
  2. How to achieve conditional break point in your ABAP program
  3. SAP ABAP SE16 and SE17
  4. TIMEOUT will also publish one order event
  5. Angular 根据指定条件动态决定是否显示自定义的popup hover Component
  6. 运行npm update等命令出错后如何分析问题根源
  7. Docker Hello World容器运行报错的解决办法
  8. 以下不能在python编译环境_win7 下解决python 集成编译环境IDLE无法打开的问题。...
  9. Android学习笔记篇2. 单选按钮、复选按钮
  10. html 横屏内容显示不全_“屏”什么喜欢你,车载显示器有哪些新玩法...