RESTful

RESTful

RESTful架构:一种软件的架构风格,设计风格, 为客户端和服务端的交互提供一组设计原则和约束条件。若是一个架构符合REST的约束条件和原则,就称它为RESTful架构。 REST与技术无关,表明的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。css

web服务交互

在浏览器中能看到的每一个网站,都是一个web服务。在提供每一个web服务的时候, 都须要先后端交互,先后端交互就必定有一些实现方案,一般叫web服务交互方案。html

目前主流的三种web服务交互方案:前端

  • REST ( Representational State Transfer)表征性状态转移【这里所说的表征性,其实指的就是资源。一般称为资源状态转移。】
  • SOAP (Simple Object Access Protocol) 简单的对象访问协议
  • XML-RPC (XML Remote Procedure Call)基于XML的远程过程调用

什么是URI,URL

  • 资源:任何事物,只要有被引用到的必要,它就是一个资源。资源能够是一个实体,也能够是抽象概念。好比在浏览器中看到的文本,视频,图片等等都是实体资源。也能够是抽象的概念,好比两我的的关系......
  • URI(统一资源标志符)是给资源进行标识的,在web中的惟一标识就是URI
  • URL(统一资源定位符)是描述资源地址的。URL能够说是URI的子集,经过定位的方式实现的URI
  • URI相似身份证是惟一的,URL相似家庭住址xx省/xx市/xx村/xx号街道/xx号楼/Alex

统一资源接口

  • 咱们能够经过URL去访问到资源,对资源会有不少不一样的操做,增删改查
  • 之前可能会为了这个增长新设计一个URL,这个URL就是对数据进行增长的, 还会为了更新和删除分别设计一个URL
  • 如今不用了,只有一个URL,而后根据HTTP请求方式的不一样,对资源进行不一样的操做,这个就是是统一资源接口
  • 必定要遵循HTTP请求方法的语义,也就是说POST请求就在新增数据等....

资源的表述

  • 资源的表述其实就是资源的展示形式,客户端和服务端传输的都是资源的表述,而不是资源自己
  • 例如文本资源能够采用html、xml、json等格式,图片可使用PNG或JPG展示出来
  • 那么客户端如何知道服务端提供哪一种表述形式呢? 能够经过HTTP内容协商,客户端能够经过Accept头请求一种特定格式的表述,服务端则经过Content-Type告诉客户端资源的表述形式。
  • 这些资源的表述呈如今页面上,就是资源状态。

状态转移

  • 咱们在看页面的时候,从当前资源的表述(也能够说状态或者表现层)会跳转到其余的资源状态
  • 服务端经过超媒体告诉客户端当前状态有哪些后续状态能够进入
  • 这些相似"下一页"之类的连接起的就是这种推动状态的做用——指引你如何从当前状态进入下一个可能的状态

REST风格特色

  • (1)在web中,只要有被引用的必要都叫资源。
  • (2)每一个URI表明一个资源,独一无二的。
  • (3)客户端经过HTTP的方法,对服务器端资源进行操做;
  • (4)客户端和服务器之间,传递这种资源的某种表现层;
  • (5)经过超连接的指引,实现"表现层状态转移"。

RESTful规范

  1. 路径:面向资源编程
    • 每一个URL表明一种资源,URL中尽可能不要用动词,要用名词(可复数)。
    • https://api.example.com/v1/zoos
    • https://api.example.com/v1/animals
    • https://api.example.com/v1/employees
  2. method:根据method不一样,进行不一样的操做
    • GET/POST/PUT/DELETE/PATCH
    • GET :从服务器取出资源(一项或多项)
    • POST :在服务器新建一个资源
    • PUT :在服务器更新资源(客户端提供改变后的完整资源)
    • PATCH :在服务器更新资源(客户端提供改变的属性)
    • DELETE :从服务器删除资源
  3. 版本:在URL中体现版本
    • https://www.bootcss.com/v1/mycss
    • https://v1.bootcss.com/mycss
  4. 域名:在URL中体现是不是API
    • https://www.bootcss.com/api/mycss
    • https://api.bootcss.com/mycss
  5. 过滤:经过在url上传参的形式传递搜索条件
    • https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
    • https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
    • https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
    • https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪一个属性排序,以及排序顺序
    • https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
  6. 协议:尽可能使用HTTPS
    • https://www.bootcss.com/v1/mycss
  7. 状态码:
    • 1** 信息,服务器收到请求,须要请求者继续执行操做
    • 2** 成功,操做被成功接收并处理
    • 3** 重定向,须要进一步的操做以完成请求
    • 4** 客户端错误,请求包含语法错误或没法完成请求
    • 5** 服务器错误,服务器在处理请求的过程当中发生了错误
  8. 返回值:针对不一样操做,服务器向用户返回的结果应该符合如下规范
    • GET请求 返回查到全部或单条数据
    • POST请求 返回新增的数据
    • PUT请求 返回更新数据
    • PATCH请求 局部更新 返回更新整条数据
    • DELETE请求 返回值为空
  9. 错误处理:
    • 状态码是4xx时,应返回错误信息,error当作key。
    • { error: "Invalid API key" }
  10. Hypermedia API: 若是遇到须要跳转的状况 携带调转接口的URL
    • RESTful API最好作到Hypermedia,即返回结果中提供连接,连向其余API方法,使得用户不查文档,也知道下一步应该作什么。
 ret = {
                code: 1000,
                data:{
                    id:1,
                    name:'小强',
                    depart_id:http://www.luffycity.com/api/v1/depart/8/
                },
                link: {
                  "rel":   "collection https://www.example.com/zoos",
                  "href":  "https://api.example.com/zoos",
                  "title": "List of zoos",
                  "type":  "application/vnd.yourformat+json"
                }
            }

状态码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
200 OK - [GET]:服务器成功返回用户请求的数据,该操做是幂等的(Idempotent)。
201 CREATED - [POST / PUT / PATCH]:用户新建或修改数据成功。
202 Accepted - [ * ]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST / PUT / PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操做,该操做是幂等的。
401 Unauthorized - [ * ]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [ * ] 表示用户获得受权(与 401 错误相对),可是访问是被禁止的。
404 NOT FOUND - [ * ]:用户发出的请求针对的是不存在的记录,服务器没有进行操做,该操做是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(好比用户请求JSON格式,可是只有XML格式)。
410 Gone - [GET]:用户请求的资源被永久删除,且不会再获得的。
422 Unprocesable entity - [POST / PUT / PATCH] 当建立一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [ * ]:服务器发生错误,用户将没法判断发出的请求是否成功。
502 :网关不可用
503 :服务不可用   Server Unavailable / / 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
504 :网关超市
505 :版本不支持

为何要作先后端分离的项目

  1. 知足多端适配
    • 随着移动端的兴起,如今公司产品不仅限于pc端的,包括Android,IOS。
    • 按照之前的方式,后端其实就要有多套,pc一套,APP端两套。
    • 开发成本以及开发效率会很低,若是先后端分离,后端只须要有一套就能够了
    • 后端只提供接口,前端不论是pc仍是APP均可以去调用数据。
  2. 先后端职责不清晰
    • 咱们的模板语言究竟是前端写仍是后端写
  3. 开发效率 先后端互相等待
  4. 前端配合后端,只写模板语言,能力受限
  5. 后端开发语言与模板语言耦合度较高,依赖开发语言,更换后端语言的成本加大。
相关文章
相关标签/搜索