什么是RESTful
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。直白来说,REST指的是一组架构约束条件和原则。” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
详细描述
资源(Resources):网络上的一个实体,或者说是网络上的具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体存在的物体。可以用一个URI(统一资源标识符)指向它,每种资源对应一个特定的URI。获取资源,访问它的URI就可以
表现层(Representation):把资源呈现出来的形式,为表现层,这是由于资源只是一个信息实体,未表现。URL只代表资源的实体,其具体的表现形式在http的请求头信息中用Accept和Content-Type字段指定。
状态转化(State Transfer):访问一个网站,就代表了客户端和服务器的一个交互过程,其中就涉及到数据的状态变化。具体来说,HTTP为无状态的协议,客户端想要操作服务端,必须通过某种方式,让服务器的状态发生变化,而这种方法的操作方式由GET、POST、DELETE、PUT,最终实现状态转化。GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
为什么会有RESTful
RESTful产生之前,用户的请求
http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息
RESTful产生后
http://127.0.0.1/user/2 GET 根据用户id查询用户数据
http://127.0.0.1/user POST 新增用户
http://127.0.0.1/user PUT 修改用户信息
http://127.0.0.1/user DELETE 删除用户信息
很明显,通过以上操作,RESTful产生后,url中没有描述的字样,用get、post、put和delete便可以完成相应的功能,接口统一.
下来我们再详细看看RESTful框架的内容
URL设计
- URL中不包含动词
- URL中不加人版本号,版本号加入到Accept中区分
- 使用_或-来让URI可读性更好,对单词分割
- 使用/来表示资源的层级关系
- 使用?用来过滤资源 /pulls?state=closed
统一资源接口
RESTful遵循统一的接口规则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源(资源可以是任何事物,只是一个抽象的概念,比如手机号、个人信息等)的访问。
幂等性:对同一REST接口(url)的多次访问,得到的资源状态是相同的
安全性:对REST接口方法,不会使服务端资源的状态发生改变
以下,列出get/post/delete/put的典型用法
GET
- 安全且幂等
- 获取表示
- 变更时获取表示(缓存)
- 200(OK) - 表示已在响应中发出
- 204(无内容) - 资源有空表示
- 301(Moved Permanently) - 资源的URI已被更新
- 303(See Other) - 其他(如,负载均衡)
- 304(not modified)- 资源未更改(缓存)
- 400 (bad request)- 指代坏请求(如,参数错误)
- 404 (not found)- 资源不存在
- 406 (not acceptable)- 服务端不支持所需表示
- 500 (internal server error)- 通用错误响应
- 503 (Service Unavailable)- 服务端当前无法处理请求
POST
- 不安全且不幂等
- 使用服务端管理的(自动产生)的实例号创建资源
- 创建子资源
- 部分更新资源
- 如果没有被修改,则不过更新资源(乐观锁)
- 200(OK)- 如果现有资源已被更改
- 201(created)- 如果新资源被创建
- 202(accepted)- 已接受处理请求但尚未完成(异步处理)
- 301(Moved Permanently)- 资源的URI被更新
- 303(See Other)- 其他(如,负载均衡)
- 400(bad request)- 指代坏请求
- 404 (not found)- 资源不存在
- 406 (not acceptable)- 服务端不支持所需表示
- 409 (conflict)- 通用冲突
- 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
- 415 (unsupported media type)- 接受到的表示不受支持
- 500 (internal server error)- 通用错误响应
- 503 (Service Unavailable)- 服务当前无法处理请求
DELETE
- 不安全但幂等
- 删除资源
- 200 (OK)- 资源已被删除
- 301 (Moved Permanently)- 资源的URI已更改
- 303 (See Other)- 其他,如负载均衡
- 400 (bad request)- 指代坏请求
- 404 (not found)- 资源不存在
- 409 (conflict)- 通用冲突
- 500 (internal server error)- 通用错误响应
- 503 (Service Unavailable)- 服务端当前无法处理请求
PUT
- 不安全但幂等
- 用客户端管理的实例号创建一个资源
- 通过替换的方式更新资源
- 如果未被修改,则更新资源(乐观锁)
- 200 (OK)- 如果已存在资源被更改
- 201 (created)- 如果新资源被创建
- 301(Moved Permanently)- 资源的URI已更改
- 303 (See Other)- 其他(如,负载均衡)
- 400 (bad request)- 指代坏请求
- 404 (not found)- 资源不存在
- 406 (not acceptable)- 服务端不支持所需表示
- 409 (conflict)- 通用冲突
- 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
- 415 (unsupported media type)- 接受到的表示不受支持
- 500 (internal server error)- 通用错误响应
- 503 (Service Unavailable)- 服务当前无法处理请求
为什么PUT是幂等的,而POST不是
POST在请求的时候,服务器会每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建,因此PUT是幂等的.
创建POST,更新PUT,其实就是这个使用就是根据客户端来决定的,如果想要两次请求
资源的表述
资源如何呈现给外界呢,大体以下几种方式:
- html
- json
- xml
客户端可以通过Accept头请求一种特定格式的表述,服务端则通过Content-Type告诉客户端资源的表述形式。