REST & RESTful API

226 阅读5分钟

什么是REST

REST(REpresentational State Transfer),表述性状态转移。REST是分布式超媒体架构风格,来源于Roy Fielding论文中。REST是一组架构原则,并非协议或标准,它的目的是帮助在世界各地不同软件、程序在网络中能够互相传递信息。

REST6大原则

1、客户端-服务器

通过将用户接口问题和数据存储问题分开,通过简化服务器组件来提高多个平台的用户接口的可移植性并提高可伸缩性。 这种C/S架构使得关注点分离,服务端专注数据存储,提升了简单些;前端专注页面展示,提升了可移植性。在之前前后端没有分离的时代,后端不仅仅需要数据的存储,还需要通过模版引擎进行页面的渲染工作,使得后端的工作变得复杂。前后端分离的开发模式,后端提供接口,前端可以将接口使用在多个平台上。

2、无状态

从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端。这一点和http协议一致,每次请求都是一次全新的请求。无状态使得服务端不需要保存会话信息,提升了简单性、可靠性、可见性,服务端不需要处理用户会话信息,自然就变得简单来;而可靠性是指,软件的稳定程度和发生故障的恢复能力,如果服务端保存着用户的会话信息,一旦服务器出现故障、用户信息丢失,就很难恢复。可见性是指接口的透明程度,由于服务端不保存用户信息,因此用户每次请求都必须包含请求所需要的所有信息。

3、可缓存

缓存约束要求将对请求的响应中的数据隐式或显式标记为可缓存或者不可缓存。如果响应是可缓存的,则客户端缓存有权重用该响应数据以用于以后的等效请求。比如有一些静态文件(JS/CSS)需要缓存,不用每次都去重新请求,减少了前后端交互,提升了性能。

4、统一接口

通过将通用性的软件工程原理应用于组件接口,简化了整体系统架构,提高了交互的可见性。接口的统一,提升了简单性,你熟悉了一套接口的风格,就了解了所有接口的风格,使得开发、沟通起来变得更简单。如何统一接口?为了获得统一的接口,需要多个架构约束来指导组件的行为。REST由四个接口约束定义:资源识别;通过陈述来处理资源;自我描述性的信息;并且超媒体作为应用状态的引擎。

5、分层系统

分层系统风格允许通过约束组件行为来使体系结构由分层组成,这样每个组件都不能’看到‘超出与他们交互的直接层。比如:中间件。

6、按需编码

REST允许通过以小程序或脚本的形式下载和执行代码来扩展客户端功能。这通过减少预先实现所需的功能数量来简化客户端。

资源

资源是任何可以被命名的事物。REST中信息的关键抽象是一种资源,REST使用资源标识符来标识组件之间交互中涉及的特定资源。

统一接口限制

1、资源标识

每个资源都可以通过URI被唯一识别

    // 获取用户
    https://api.github.com/users
    // 获取特定用户
    https://api.github.com/users/:id

2、通过表述来操作资源

表述就是 representation,比如:JSON、XML等。客户端不能直接操作服务端资源,只能通过表述去操作服务端资源,常见的就是JSON

    // 更新用户信息
    octokit.request('PATCH /user', {
      name: 'name'
    })

3、自描述信息

每个消息(请求/响应)必须提供足够的信息让接受者理解,比如:媒体类型(application/json、application/xml),HTTP方法(GET、POST、PUT、DELETE)等

$ curl -I https://api.github.com/users/octocat/orgs

> HTTP/1.1 200 OK
> Server: nginx
> Date: Fri, 12 Oct 2012 23:33:14 GMT
> Content-Type: application/json; charset=utf-8
> Status: 200 OK
> ETag: "a00049ba79152d03380c34652f2cb612"
> X-GitHub-Media-Type: github.v3
> X-RateLimit-Limit: 5000
> X-RateLimit-Remaining: 4987
> X-RateLimit-Reset: 1350085394
> Content-Length: 5
> Cache-Control: max-age=0, private, must-revalidate
> X-Content-Type-Options: nosniff

4、超媒体作为应用状态的引擎

超媒体:带文字的链接,应用状态:网页,引擎:驱动、跳转。点击链接跳转另一个网页

    // 获取特定用户
    https://api.github.com/users/:id
    // 部分返回信息
    {
      followers_url: "https://api.github.com/users/kongjun0320/followers"
    }

RESTful API

1、符合REST架构风格的API

  • 基本的URI
  • 标准的HTTP方法
  • 传输的数据媒体类型
API方法描述
api.github.com/usersGET获取用户列表
api.github.com/users/7GET获取特定用户
api.github.com/usersPOST创建用户
api.github.com/users/7PUT更新用户
api.github.com/users/7DELETE删除用户

2、资源命名规范

  • 使用名词来表示资源

  • 使用正斜杆(/)表示层次关系

  • 使用连字符(-)来提高URI的可读性

  • 在URI中使用小写字母

  • 不要使用文件扩展名

  • 不要使用下划线

  • 使用查询组件过滤URI集合