Spring rest

来源:互联网 发布:化工制图软件 编辑:程序博客网 时间:2024/06/07 16:13

1.Rest的基本原理

Rest与RPC几乎没有任何关系。RPC是面向服务的,并关注行为和动作,而REST是面向资源的,强调描述应用程序的事物和名词。

为了理解REST是什么,我们将它的首字母缩写拆分成不同的组成部分



简单说,rest就是将资源的状态以合适的形式从服务器转移到客户端(或者反之)

2.Spring是如何支持REST的


3.编写面向资源的Controller



4.执行REST动作

REST是关于资源状态转移的。需要一些动作(verb)来应用于这些资源。对于给定的资源常见的操作时在服务器上对资源进行创建、检索、更新和删除。

每个HTTP方法具有两个特性:安全性和幂等性。如果一个方法不改变资源的状态,就认为他是安全的。幂等的方法可能改变也可能不改变状态,但是每一次请求

和多次请求具有相同的作用。按照定义,所有安全的方法都必须是幂等的。




SpittleController的getSpittle()方法使用了@RequestMapping注解,并使用method属性设置其处理GET请求。

使用put更新资源



HTTPStatus.NO_CONTENT说明响应状态要设置为HTTP状态码204.这个状态码一位置请求被成功处理了。


处理delete请求


使用Post创建新的资源


这个方法的@RquestMapping与之前的不同没有value属性,就是说createSpittle()将处理/spittles的请求

这个方法使用@ResponseSatus设置状态码,这次状态码设置成了201来表明一个资源被成功创建了。

所以方法最后要做的事情就是设置Location头信息来包含资源的URL.

尽管这不是201响应的墙纸要求,但可以在响应体中返回完成的实体表述。


5表述资源

表述是Rest中很重要的一个方面。他是关于客户端和服务器端真对某一资源是如何通信的。任何给定的资源都几乎可以用任意形式来表述。

可以使用JSON、XML、html、pdf、excel等方式来展现。控制器本身通常不关心资源如何表述。控制器以java对象的方式来处理资源。

Spring提供了两种方法将资源的java表述形式转换为发送客户端的表述形式:

*基于视图渲染进行协商

*HTTP消息转换器


5.1协商资源表述

当控制器处理方法完成时,通常会返回一个逻辑视图名,如果方法不直接返回逻辑视图名(例如方法返回void)那么逻辑视图名,会来源于

请求的URL。DispatcherServlet接下来会将视图的名字传递给一个视图解析器。要求它来帮助确定应该用那个视图来渲染请求结果。


在面向人类访问的应用程序中,选择的视图通常为HTML。

当要将视图名解析为能够产生资源表述的视图时,需要从另一个维度来考虑。视图不紧要匹配视图名,而且选择的视图要适合客户端。

Spring的ContentNegotiatingViewResolver是一个特殊的视图解析器。他要作为一个bean配置在Spring应用上下文中.



ContextNegotiatingViewResolver如何工作

*确定请求的媒体类型

accept头信息并不总是可靠的。如果是web浏览器,那并不保证客户端需要的类型就是浏览器在accept头所发送的值。

ContentNegotiatingViewResolver将考虑到Accept头部信息并使用它请求的媒体类型。但它会首先查看URL的文件扩展名。如果

URL在结尾处有文件扩展名的,它将扩展名与mediaTypes中的条目进行匹配。

如果文件扩展名不能得到任何媒体类型,那就会考虑从请求中的Accept头部信息。如果请求头中不包含accept信息,那么将使用

defaultContentType属性设置的媒体类型。


影响如何选择媒体类型



*查找视图


*使用http信息转换器


典型的Spring mvc控制器方法在结束时会将一些信息放到模型中,然后到达一个视图来为用户渲染这些数据。

但是当控制器的工作是产生资源表述的时候,有一种更直接的方法可以绕过模型和数据。在这种风格的处理器方法中,

控制器返回的对象将自动转化为适合客户端的表述形式,要使用这项新技术,首先要将@ResponseBody注解添加到控制器处理方法上。


在ResponseBody中返回资源状态

正常情况下,当处理方法返回Java对象时,这个对象会放在模型中,并在视图中渲染使用。但如果处理方法使用了@ResponseBody,那表明

Http信息转换器机制会发挥作用,并将返回的对象转换为客户端需要的人一格式。

例如



@ResponseBody注解会告知Spring,我们要将返回的对象作为资源发送给客户端,并将其转换为客户端可接受的表述形式。

Spring 提供了多个HTTP信息转换器,用于实现资源表述与各种java类型之间的互相转换。





例如,假设客户端通过请求的accept头信息表明它能接受application/json,并且在jackson json在类路径下,那么处理方法返回的对象将交给MappingJacksonHttpMessageConverter,并由其转换为客户端的Json表述形式。


在ReqeustBody中接收资源状态

在Restful会话的另一端,客户端可能会以JSON、XML或其他内容格式给我们送过来一个对象来。@RequestBody也能对客户端发过来的对象做相同的事情


请求的Content-Type头信息必须是application/json

Jackson JSON库必须包含在应用程序的类路径下



了解RestTemplate的操作 


0 0
原创粉丝点击