RESTful浅谈

什么是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告诉客户端资源的表述形式。

参考
  1. https://blog.csdn.net/hzy38324/article/details/78360525?utm_source=gold_browser_extension
  2. https://www.cnblogs.com/chinajava/p/5871305.html
  3. http://www.runoob.com/w3cnote/restful-architecture.html
  4. http://nicegege.iteye.com/blog/2250237
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值