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