restful 表述性状态转移

本文介绍了RESTful架构的核心概念及其实现方式,包括资源、URI、HTTP方法的使用及其语义,以及资源表述和状态转移等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Representational State Transfer,简称REST,表述性状态转移

一种软件架构风格,不是标准

1.简介,rest使用http协议

表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,资源标识符就是URI(Uniform Resource Identifier),和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。

REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。

class Resource {

Resource(URI u);

Response get();

Response post(Request r);

Response put(Request r);

Response delete();

}

2. 要理解RESTful架构,需要理解Representational State Transfer这个词组到底是什么意思,它的每一个词都有些什么涵义。

下面我们结合REST原则,围绕资源展开讨论,从资源的定义、获取、表述、关联、状态变迁等角度,列举一些关键概念并加以解释。

  • 资源与URI
  • 统一资源接口
  • 资源的表述
  • 资源的链接
  • 状态的转移

2. 1 资源与URI

  • 资源:

    只要被引用,那就可以叫做资源,不管是json,字符串,图片,Word还是视频文件,也不管你是XML(标准通用标记语言下的一个子集)格式、txt文件格式还是其它文件格式。
    例如人的名字,性别,电话号码,酒窖的name,ID ,酒窖和酒位的关系啊等都是资源

  • URI
    资源是要被调用的,那这些资源肯定要有一个表示,而且必须唯一,这个表示可以是一个资源的路径也可以是资源的名称,如果信息没有被URI标记,那就不能算是真正的资源,因为你不能调用
    例如:github上面的每个项目的ssh或者是http资源路径,他们都是唯一的

URI的设计:
1. 使用/表示资源的层级关系
api/admin/cellar/:id
2. 使用?进行过滤资源
/git/git/pulls?state=closed
用来表示git项目中已经关闭的推入请求
3. 用.或者;表示同级资源

2.2 统一资源接口

不论什么资源,都应该使用相同的接口进行资源的访问,接口应该使用标准的http方法,如get post 等,并遵循这些方法的语义。
例如:name的操作,接口都应该统一,URI中只应该包含资源的名称
GET/admin/name
POST/admin/name
PUT/admin/name
DELETE/admin/name
全部通过 URI对资源进行唯一的标识。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
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)- 服务端当前无法处理请求

2.3资源的表述

上面提到,客户端可以通过http的方法获取资源,具体来说,应该是资源的表述,是资源在外界的具体呈现,例如123.img这个表述就是对一个图片资源的表述,

我感觉,REST除了给我们带来了一个崭新的架构以外,还有一个重要的贡献是在开发系统过程中的一种新的思维方式:通过url来设计系统的结构。根据REST,每个url都代表一个resource,而整个系统就是由这些resource组成的。因此,如果url是设计良好的,那么系统的结构就也应该是设计良好的
 .factory('Cellars', ['$resource', '$http', '$window','Settings', function ($resource, $http, Settings) {
    var Server = Settings.httpServer;
    return $resource('api/admin/cellar/:id', { id: '@cellarid' },
      {
      })
  }])
OK,既然url有这样的好处,那我们就着重讨论一下如何设计url。网络应用通常都是有hierarchy的,像棵大树。我们通常希望url也能反映出资源的层次性。比如对于一个藏酒资源应用:/api/admin/表示进入管理者权限,/cellar/:id表示id为N的酒窖,这都比较直观。
angular.module('starter.iotservices', [])

.factory('Cellars', ['$resource', '$http', '$window','Settings', function ($resource, $http, Settings) {
    var Server = Settings.httpServer;
    return $resource('api/admin/cellar/:id', { id: '@cellarid' },
      {
      })
  }])

  .factory('Areas', ['$resource', '$http', '$window', 'Settings', function ($resource, $http, Settings) {
    var Server = Settings.httpServer;
    return $resource('api/admin/area?name=:name', { name: '@cellarname' },
      {
      });

  }])
2.4 状态转移
应用状态和资源状态

客户端就是应用,服务器数据库就是资源
客户端的应用发送实际请求,这时候应用状态改变,服务器接收到这个请求,服务器中资源状态改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值