REST介绍
REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:
1、网络上的所有事物都被抽象为资源(resource);
2、每个资源对应一个唯一的资源标识(resource identifier);
3、通过通用的连接器接口(generic connector interface)对资源进行操作;
4、对资源的各种操作不会改变资源标识;
5、所有的操作都是无状态的(stateless)。
需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。
传统的请求模式和REST模式的请求模式区别:
作用 | 传统模式 | REST模式 |
---|---|---|
列举出所有的用户 | GET /users/list | GET /users |
列出ID为1的用户信息 | GET /users/show/id/1 | GET /users/1 |
插入一个新的用户 | POST /users/add | POST /users |
更新ID为1的用户信息 | POST /users/mdy/id/1 | PUT /users/1 |
删除ID为1的用户 | POST /users/delete/id/1 | DELETE /users/1 |
关于更多的REST信息,可以参考:http://zh.wikipedia.org/wiki/REST
RESTFul支持
3.2的RESTFul支持更为灵活,你只需要把控制器继承ThinkControllerRestController即可。 继承RestController控制器后你的访问控制器就可以支持下面的一些功能:
- 支持资源类型自动检测;
- 支持请求类型自动检测;
- RESTFul方法支持;
- 可以设置允许的请求类型列表;
- 可以设置允许请求和输出的资源类型;
- 可以设置默认请求类型和默认资源类型;
REST参数
继承了RestController后,你可以在你的控制器里面设置rest相关的属性参数,包括:allowMethod,defaultMethod,allowType,defaultType以及allowOutputType。
属性名 说明 默认值 allowMethod REST允许的请求类型列表 array('get','post','put','delete') defaultMethod REST默认请求类型 get allowType REST允许请求的资源类型列表 array('html','xml','json','rss') defaultType REST默认的资源类型 html allowOutputType REST允许输出的资源类型列表 array( 'xml' => 'application/xml', 'json' => 'application/json','html' => 'text/html',) 一.首先,什么是REST?
REST从字面上讲叫做Representational State Transfer,翻译成表现层状态转移,但是一般在翻译的时候,前面会加一个Resource,即Resource Representational State Transfer,即为资源表现层状态转移.用人话讲就是:客户端通过HTTP请求,对服务器端的资源进行操作,实现"表现层(使用HTTP动词去促使服务器端资源的)状态发生改变".二. 什么是RESTful?
RESTful是代表REST化,或者说设计遵从REST架构的,所以要了解RESTful就需要了解REST.三.我们为什么要使用RESTful的风格来开发接口?
先从传统设计接口的方式来看:
新增一个员工:http://www.demo.cn/finance/employee/createEmp
删除一个员工:http://www.demo.cn/finance/employee/deleteEmp
修改一个员工:http://www.demo.cn/finance/employee/updateEmp
获取员工列表:http://www.demo.cn/finance/employee/listEmp
现在我们发现:一个非常简单的需求产生的问题:
1.每一个操作,都需要一个独立的url去操作,因为我们对员工的动作都需要反映在url里面.
2.会产生大量的url,非常不方便接口的维护和文档的维护
3.如果有不同的响应方式,我们可能需要额外的参数,甚至不同的url来描述
4.请求参数包含在请求地址中,无法针对性做缓存
如果我们使用RESTful风格的接口,那么我们可以如下做:
新增一个员工:POST http://www.demo.cn/finance/employee
删除一个员工:DELETE http://www.demo.cn/finance/employee
修改一个员工:PATCH http://www.demo.cn/finance/employee
获取员工列表:GET http://www.demo.cn/finance/employee
可以发现,我们通过HTTP的请求方式来给予这些请求的不同含义,动作设计和示例如下:
下面是一个简单的实践,我们可以使用去哪儿网开源的YApi来帮助我们管理接口并测试: