Restful学习

RESTful 学习

Restful 是什么

本质:一种软件架构风格

核心:面向资源

解决问题:降低复杂性,提高系统的可伸缩性

设计概念和准则:

  • 网络上的所有事物都可以被抽象为资源
  • 每一个资源都有唯一的资源标识,对资源的操作不会改变这些标识。删除资源,标识还在,资源不在了
  • 所有的操作都是无状态的

什么是资源?
网络上的任何东西

为什么要使用 Restful

Restful 中 HTTP 协议介绍

restful 与 http 无关,但是常用基于 http 协议的一种实现。

HTTP 协议-URL

应用层协议,简捷快速

schema://host[:port]/path [?query-string][#anchor]
  • schema:底层使用的协议,如 http,https,ftp
  • host:端口或者域名
  • port:http 默认 80,https 默认 443
  • path:资源路径
  • query-string:发送给 http 服务器的数据
  • anchor:锚。??

HTTP-请求

请求行、消息报头、正文

  • GET:请求资源
  • POST:在标识的资源后附加新的数据
  • HEAD:请求资源的响应消息报头。比如资源的创建时间和最后修改时间
  • PUT:更新资源
  • DELETE:请求删除标识资源
  • OPTIONS:查询服务器的性能,或者与资源相关的选项和需求。比如说可以获得的哪些服务

HTTP-响应

状态行、消息报头、响应正文

响应状态码

  • 200,OK,成功返回用户请求数据
  • 201 CREATED,新建或修改数据成功
  • 204 NO CONTENT,删除数据成功
  • 400,Bad Request,语法错误
  • 401,Unauthorized,表示用户没有认证,无法进行当前操作
  • 403 Forbidden,表示用户访问是被禁止的
  • 404,资源不存在
  • 422,创建一个对象时,发生一个验证错误。比如用户需要提供用户名和密码,但前端只提供了用户名,这个时候就返回 422
  • 500,服务器内部错误,用户无法判断发出的请求是否成功
  • 503,服务器当前不能处理请求,比如性能到瓶颈了

RESRful 和其他的区别

  • SOAP WebService
    也是一种基于 http,采用 XML 格式进行封装,增加了特定的 http 消息头。更安全

restful 最大程度的利用了 http

如何使用 RESTful API

RESTful API 设计要素

  • 资源路径(URI)
  • HTTP 动词
  • 过滤信息
  • 状态码
  • 错误处理
  • 返回结果

资源路径

  • 用名词而不是动词,用复数

例子:
有一个 API 体哦给你 zoo 的信息,还包括各种动物和员工信息

    https://api.example.com/v1/zoos
    https://api.example.com/v1/animals

如上,v1 代表 uri 的版本号。两种方式,在 url 中加入版本,或者在 http 请求头。

HTTP 动词

  • POST /zoos: 新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息
  • PUT /zoos/ID:更新某个指定动物园的信息
  • DELETE /zoos/ID:删除某个动物园

过滤信息

用户自己设置的,需要什么信息,多少信息

错误处理

如果状态码是 4XX 或者 5XX,就应该返回出错信息。

用键值对返回。

1
2
3
{
"error":"参数错误"
}

返回结果

  • GET /collections:返回资源对象的列表(数组)
  • GET /collections/identity:返回单个资源对象(没有就 404)
  • POST /collections:返回新生成的资源对象
  • PUT /collections/identity:返回完整的资源对象
  • PATCH /collections/identity:返回被修改的属性
  • DELETE /collections/identity:返回一个空文档(204)

确认设计要素

  • 用户登录、注册

  • 文章发表、编辑、管理、列表

  • 用户注册:
    email 为空
    用户名为空
    密码为空

    检测 email 重复
    然后写入数据库,password 加密
    注册失败
    返回用户信息:user_id,user_name,email,figure。删除密码字段

  • 用户登录:
    email 为空
    password 为空
    返回用户信息:user_id,user_name,email,figure。删除密码字段

错误码定义在一个文件里面