为什么80%的码农都做不了架构师?>>>   

一.REST内容协商介绍 

RESTful服务中很重要的一个特性即是同一资源,多种表述.也即如下面描述的三种方式:

1.使用http request header: Accept
GET /user/123 HTTP/1.1
Accept: application/xml                 //将返回xml格式数据  GET /user/123 HTTP/1.1
Accept: application/json               //将返回json格式数据

2.使用扩展名

/user/123.xml  将返回xml格式数据
/user/123.json 将返回json格式数据
/user/123.html 将返回html格式数据

3.使用参数

/user/123?format=xml          //将返回xml数据
/user/123?format=json          //将返回json数据 
而以上三种各有优缺点:
1.使用Accept header:
这一种为教科书中通常描述的一种,理想中这种方式也是最好的,但如果你的资源要给用户直接通过浏览器访问(即html展现),那么由于浏览器的差异,发送上来的Accept Header头将是不一样的. 将导致服务器不知要返回什么格式的数据给你. 下面是浏览器的Accept Header
Html代码 
  1. chrome:
  2. Accept:application/xml,application/xhtml+xml,textml;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
  3. firefox:
  4. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. IE8:
  6. Accept:image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
2.使用扩展名
丧失了同一url多种展现的方式,但现在这种在实际环境中是使用最多的.因为更加符合程序员的审美观.
3.使用参数
现在很多open API是使用这种方式,但可能由于要编写的字符较多,所以较少使用.

带着上面的选择: 使用扩展名,我们来看一下spring中如何配置这部分.

二.spring配置

现在spring完成内容协商( content negotiation)的工作是由ContentNegotiatingViewResolver来完成的.它的工作模式支持我上面讲的三种, ContentNegotiatingViewResolver是根据客户提交的MimeType(如 text/html,application/xml)来跟服务端的一组viewResover的MimeType相比较,如果符合,即返回viewResover的数据. 而 /user/123.xml, ContentNegotiatingViewResolver会首先将 .xml 根据mediaTypes属性将其转换成 application/xml,然后完成前面所说的比较.

下面是ContentNegotiatingViewResolver的完全配置.

<beanclass="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"><!-- 设置为true以忽略对Accept Header的支持 --><property name="ignoreAcceptHeader" value="true" /><!-- 在没有扩展名时即: "/user/1" 时的默认展现形式 --><property name="defaultContentType" value="text/html" /><!-- 扩展名至mimeType的映射,即 /user.json => application/json --><property name="mediaTypes"><map><entry key="json" value="application/json" /><entry key="xml" value="application/xml" /></map></property><!-- 用于开启 /userinfo/123?format=json 的支持 --><property name="favorParameter" value="false" /><property name="viewResolvers"><list><bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/pages" /><property name="suffix" value=".jsp"></property></bean></list></property><property name="defaultViews"><list><!-- for application/json --><beanclass="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /><!-- for application/xml --><!-- <bean class="org.springframework.web.servlet.view.xml.MarshallingView" > <property name="marshaller"> <bean class="org.springframework.oxm.xstream.XStreamMarshaller"/> </property> </bean> --></list></property></bean>

转载于:https://my.oschina.net/psuyun/blog/161047

spring REST中的内容协商(同一资源,多种展现:xml,json,html)相关推荐

  1. Spring框架中的内容协商

    1.简介 使用BeanNameViewResolver完成的工作就是,我们刚刚在Spring上下文中创建了多个bean视图以生成预期的输出. Spring很快引入了内容协商策略 ,该策略可以使用传统的 ...

  2. Spring MVC 中使用AOP 进行统一日志管理--XML配置实现

    1.介绍 上一篇博客写了使用AOP进行统一日志管理的注解版实现,今天写一下使用XML配置实现版本,与上篇不同的是上次我们记录的Controller层日志,这次我们记录的是Service层的日志.使用的 ...

  3. Spring Boot中防表单重复提交以及拦截器登录检测

    目录 理论 演示 源码 理论 在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测. 相关的逻辑步骤 ...

  4. spring boot中利用mybatis-generator插件生成代码

    使用Idea在spring boot中集成mybatis-generator,自动生成mapper.xml  model  dao 文件 一.配置 pom.xml 在pom.xml的<plugi ...

  5. spring内容协商管理_Spring框架中的内容协商

    spring内容协商管理 1.简介 使用BeanNameViewResolver完成的工作就是,我们刚刚在Spring上下文中创建了多个bean视图以生成预期的输出. Spring很快引入了内容协商策 ...

  6. Spring Boot中使用模板引擎引用资源

    目录 概念 演示 概念 在Spring Boot中可以通过模板引擎去引用资源,如果项目改变了,也是可以跑的,不需要自己手动一个个去改链接. 演示 运行截图如下: 但修改properties文件: se ...

  7. springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  8. Spring MVC中静态资源的处理

    Spring MVC中静态资源的处理 REST风格的资源URL中不带后后缀,比如 /blog/tom -> 用户tom的blog资源 /order/1234 -> 订单号为1234的订单资 ...

  9. spring mvc 中静态资源404、302错误

    [求教]spring mvc 中静态资源404.302错误 (2019/3/22补充)在新的项目中也偶尔遇到资源被拦截的情况(前提我已经设置了各种静态资源不被拦截的措施),至今仍然没能找到具体原因,所 ...

最新文章

  1. 【快速入门系列】简述 for...in 和 for...of 区别
  2. Java 巨坑篇之无底深坑Long类型
  3. 交换机复习笔记 广播风暴抑制
  4. alexa api php,PHP使用Alexa API获取网站的Alexa排名例子
  5. 老榕智能建站软件_2020年,10大最佳免费建站软件
  6. 7.11.4 第一个程序 设置环境变量
  7. windows环境给redis配置密码
  8. oracle 中此处列不允许,oracle-序列 ora-02287 此处不允许序号
  9. VC2008中使用GDI+(转)
  10. LIRe 源代码分析 7:算法类[以颜色布局为例]
  11. AcWing 208. 开关问题 (高斯消元+状压)打卡
  12. ios 文本翻转_反转文字的方法_深入浅出 iPhone 开发 (使用 Swift4)_iOS视频-51CTO学院...
  13. 百度地图API相关点
  14. 【信号与系统|吴大正】4:信号分解、傅里叶变换与信号谱(下)
  15. 群联PS3111坏硬盘修复记录
  16. 计算机怎么清理CAD,怎么完全卸载cad
  17. [双目视差] 单双目MATLAB 相机标定(二)双目摄像机标定
  18. matlab 图片字符切割,基于MATLAB的图片中字符的分割与识别
  19. 初中英语语法(006)-特殊疑问句·祈使句·感叹句
  20. 鸿蒙系统发布会门票,早鸟票最后一天!继鸿蒙系统发布后,华为又准备搞事情了!...

热门文章

  1. Palo Alto Networks 支持仪表盘漏洞泄露数千份客户支持工单
  2. 这个TsuNAME 新漏洞可对关键 DNS 服务器发动 DDoS 攻击
  3. windows curl ssl版本号编译
  4. VMware SDS 之一:什么是VSAN??
  5. SocketType 枚举----指定 Socket 类的实例表示的套接字的类型
  6. 某化工学院安装锐捷elog
  7. The new year,new mood,new plan~~
  8. Linux系统中网络配置详解(一)
  9. ubuntu 13.10 64位安装及配置 google拼音输入法及Adobe flash player、mp3 插件安装、中文GBK编码等 -转
  10. Linux系统启动过程分析 -转