RESTful Web Service介绍
Roy Thomas Fielding博士2000年提出的
REST是英文Representational
State Transfer的缩写
表象化状态转变 或者 表述性状态转移
REST是Web服务的一种架构风格
使用HTTP、URI等广泛流行的标准和协议
轻量级、跨平台、跨语言的架构设计。
REST到底是什么?
REST是一种设计风格。它不是一种标准,也不是一种软件,而是一种思想。
REST通常基于使用HTTP,URI,和XML,JSON以及HTML这些现有的广泛流行的协议和标准。
RESTful是什么
RESTful对应的中文是 REST式的。
RESTful Web Service是一种常见的REST的应用,是遵守了REST风格的web服务。
两种主要的web服务
JAX-RS
RESTful Web Service
JAX-WS Web Service
REST 架构的主要原则
网络上的所有事物都可被抽象为资源(Resource)
每个资源都有一个唯一的资源标识符(Resource
Identifier)
同一资源具有多种表现形式(xml、json等)
对资源的各种操作不会改变资源标识符
所有的操作都是无状态的(Stateless)
符合REST原则的架构方式即可称为RESTful
无状态性
无状态性使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前
Request,而不必了解前面
Request 的历史。
从而可以更容易地释放资源。
让服务器充分利用
Pool 技术来提高稳定性和性能。
资源操作
GET: 获取一个资源
POST: 创建一个新的资源
PUT: 修改一个资源的状态
DELETE :删除一个资源
资源展现
XML
JSON
……
原来的方式
GET方法,根据用户id****获取数据
User POST****方法,用户修改
User POST****方法,用户新增
GET/POST方法,用户根据id****删除
RESTful
[]( {id})[ {id}]( {id}) GET方法,根据用户id****获取数据
PUT****方法,用户修改
POST****方法,用户新增
DELETE方法,用户根据id****删除
开发的接口,web服务更加的简洁
REST接口定义
幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。
安全性:对该REST接口访问,不会使服务器端资源状态发生改变。
最佳实践
最佳实践:REST接口设计
• URL的组成
– 网络协议(http、https)
– 服务器地址
– 接口名称
– 参数列表
• URL定义限定
– 不要使用大写字母
– 使用中线 - 代替下划线 _
– 参数列表应该被encode过
最佳实践:响应设计
Content body 仅仅用来传输数据
数据要做到拿来就可用的原则,不需要“拆箱”的过程
用来描述数据或者请求的元数据放Header中
http响应状态码
SpringMVC实现RESTful服务
SpringMVC原生态的支持了REST风格的架构设计。
所涉及到的注解:
@RequestMapping
@PathVariable
@ResponseBody
ResponseEntity
……
RESTful风格开发商品接口
根据RESTful风格,编写商品功能的增删改查接口
编写商品查询接口
在ItemInterfaceController编写
@Controller@RequestMapping("item/interface")public classItemInterfaceController { @Autowired private ItemService itemService; // http://manager.taotao.com/rest/item/interface/{id} /** * 根据id查询用户 * * @param id * @return 返回的类型是ResponseEntity,泛型声明为需要返回的数据类型 */ @RequestMapping(value = "{id}", method =RequestMethod.GET) // 返回的是ResponseEntity或者加上@ResponseBody注解的效果是一样的,任选其一即可,也可以都设置。// @ResponseBody publicResponseEntity- queryItemById(@PathVariable("id") Long id) { try { Item item = this.itemService.queryById(id); // 查询成功,响应的状态码应为200 // 可以设置HttpStatus枚举的OK // returnResponseEntity.status(HttpStatus.OK).body(Item); // 也可以使用ok()方法,效果和上面是一样的 returnResponseEntity.ok().body(item); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 如果有异常,设置状态码为500 returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); }}