rss spring 接口_spring 接口支持返回多种格式
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 接口支持返回多种格式相关推荐
- 【SpringCloud】设置接口同时支持返回多种数据类型(json、xml)
文章目录 一.业务场景 二.使用步骤 1.引入核心Jar包 2.定义一个测试接口 2.1.接口 2.2.实现接口 2.3.控制器定义接口 三.接口测试 1.请求返回json类型数据 2.请求返回xml ...
- 修复登录接口仿抽奖助手微信小程序源码下载-支持商家认证多种开奖方式
本版本是已经修复登录接口的 支持商家认证带V 支持多种抽奖模式 支持多种开奖方式 导航自定义,首页福利推送自定义 更多功能具体自行研究 PS:导航路径需要自行添加 下面是小编测试演示图: 小程序源码下 ...
- java 扩展接口_详解常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- spring boot开发接口api
spring boot开发接口api 在上一次教了大家怎么去搭建一个自己的后端模板之后,现在和大家分享讨论一下如何开发RestfulApi接口. 首先开发api之前要考虑到后端是需要写api文档的 ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- 基于springboot的支持http接口+dubbo接口的TestNG自动化测试框架
一.背景 由于大多数公司都是使用Java作为后端开发语言,因此为了更好的与研发的框架对接.测试,掌握一套Java的自动化测试框架也逐渐成为测试人员的必修课. 同时随着现在微服务框架的流行,自动化测试框 ...
- 芋道 Spring Boot API 接口文档 Swagger 入门
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...
- java接口返回xml格式_xml格式接口数据编程实战
系统对外提供接口,或者系统调用外部接口,常常会使用xml格式作为接口数据传输格式(json数据,txt文本数据亦可),下面讲讲xml数据的生成和解析. 首先讲讲xml数据生成,通常可以用两种方法,使用 ...
- java接口返回xml格式_Java xml数据格式返回实现操作
前言:对于服务器后端开发,接口返回的数据格式一般要求都是json,但是也有使用xml格式 RequestBody注解 对于SpringMVC,很多人会认为接口方法使用@Controller搭配@Res ...
最新文章
- vue怎么vw布局好用_vue 实现 rem 布局的 或者 vw 布局的方法
- 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
- 神经网络的梯度消失和过拟合产生原因及其解决方案
- GDB调试程序系列 (3)
- JDK6u25里添加的按线程统计分配内存量: JMX
- c#随机数的产生与输出【C#】
- 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...
- 【Kafka】Kafka 奇怪问题之无法用Java 客户端消费
- centos屏幕视频录制,转换
- Atitit snownlp nlp 常见功能 目录 1.1. 主要功能:	1 1.2. 官网信息:	2 1.3. # 自动摘要 vs 关键词提取	2 1.4. Tf idf算法	2 1.5. p
- Eclipse_设置JSP模板
- 苹果6S怎么录屏_苹果6s来电没声音怎么回事
- 搜索引擎(二)网页排名算法(1)PageRank
- SharePoint 2013 开发中JavaScript本地化方案
- 二手房交易有哪些税费?
- 求两个圆公切线的模板
- JMeter性能测试,入门到入土
- html导航图片滚动条,CSS实现导航栏底部动态滚动条效果
- 【android】Notification 和 Service的结合应用以及Notification在Android8.0之后的坑 Bad notification
- 硬盘分区按照1G=1024M换算分区后不是整数(想分10G,分区时填入大小102400M.但是分区完毕显示却是99.9G或近似值9.XXG,而不是10G整)。本篇为这个问题的原理分析和解决办法
热门文章
- SAP Fiori Launchpad的后台配置路径
- How to achieve conditional break point in your ABAP program
- SAP ABAP SE16 and SE17
- TIMEOUT will also publish one order event
- Angular 根据指定条件动态决定是否显示自定义的popup hover Component
- 运行npm update等命令出错后如何分析问题根源
- Docker Hello World容器运行报错的解决办法
- 以下不能在python编译环境_win7 下解决python 集成编译环境IDLE无法打开的问题。...
- Android学习笔记篇2. 单选按钮、复选按钮
- html 横屏内容显示不全_“屏”什么喜欢你,车载显示器有哪些新玩法...