前言

本人非专科 (材料人),仅爱好学习 (兴趣爱好),文章内容可能有落后或者错误,非常需要大家分享意见和纠错!

一、API 类型和Web 发展和前后端分离

1、API分类

  1. 分类1:打包功能直接调用,比如JAVA jar。一般叫这个API称为 SDK
  2. 分类2:通过接口HTTP协议访问进行请求。叫做 web应用接口

2、web发展阶段

  1. 静态内容阶段
  2. CGI 程序阶段
  3. 脚本语言阶段
  4. 瘦客户端应用阶段
  5. RIA 应用阶段
  6. 移动 Web 应用阶段

3、传统 vs 前后端分离

image.png

问题:前后端严重耦合

  1. 前端需要改bug调试时,需要在当前电脑安装一整后端的开发工具,启动后端程序。
  2. 还要求后端人员会html,js等前端语言。
  3. 前端页面也会嵌入很多后端的代码
  4. 一旦后端换了一套语言,前端也需要重新开发
  5. 沟通成本,调试成本,前后端开发进度相互影响,从而大大降低开发效率

image.png

前端服务器纯静态资源服务器 (html/css/js/images),将响应数据通过js/vue/jQuery技术渲染到页面上。

接口服务器发送数据 (JSON格式) :

[
    {id: 1, name: "hansjack"},
    {id: 1, name: "shark2051"}
]

优点:

  1. 前后端责任清晰,后端专注于数据上,前端专注于视觉上。
  2. 无需等待对方的开发工作结束,提高开发效率。
  3. 可应对复杂多变的前端需求。
  4. 增强代码可维护性

二、RESTful接口设计

统一接口设计,具有 RESTful 风格的 API 接口。

REST 是一种设计 API 接口规则,在web项目中非常受欢迎;在设计接口时候,如果满足 REST 约束条件和原则的应用程序或设计就称其为 RESTful 应用。

1、约束规则

(1 路径设计

传统的web接口 (请求映射方法) 设计需要:

文章列表:

@Controller
public class PostController {
    @RequestMapping("/post/list")
    public String list(Model model) {
        model.addAttribute("list", EssayService.list())
        return "post/list";
    }
}
  1. 请求路径,简明
  2. 请求方式,可变,忽略
  3. 请求参数,需求
  4. 请求响应,模板路径

RESTful接口设计需要:

@Controller
public class Postcontroller
    @RequestMapping(value ="/posts",method = RequestMethod.GET)
    @ResponseBody
    public List<Post> list(){
        return PostService.list();
    }
}

RESTful API将应用程序的状态和功能划分为资源,并通过HTTP方法对这些资源进行操作。每个资源都有一个唯一的URL标识

(2 请求方式1

HTTP方法操作幂等性安全性
GET获取资源
POST创建资源
PUT更新或替换资源
DELETE删除资源
PATCH部分更新资源
HEAD获取资源元数据
OPTIONS获取资源支持的方法

请求客户端一般使用GET、POST两个方法2
请求-覆盖

(3 请求参数

一定是名称,对应资源。

(4 请求响应

JSON格式

2、状态码 2

HTTP 状态码五个类型:

  • 1xx:相关信息
  • 2xx:操作成功
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务器错误

(1 状态码1xx

(2 状态码2xx

(3 状态码3xx

(4 状态码4xx

(5 状态码5xx

3、资源表现形式

HTTP请求的头信息中使用Accept和Content-Type字段指定。

image.png

三、实践

1、发布文章

调用了 Typecho_Db::lastInsertId() 方法,但实际上这个方法并不存在。正确的做法是通过 Typecho_Db::query() 方法执行INSERT语句,它会自动返回插入的ID。

6、权限细化

资源类型游客注册用户作者编辑管理员
文章查看
文章创建
文章编辑自己自己
文章删除自己自己
评论查看
评论创建
评论删除自己自己
用户管理
系统设置

7、令牌认证

获取访问令牌

POST /api/v1/tokens 
Content-Type: application/json 

{ 
    "name": "username_or_email", 
    "password": "user_password" 
}

8、版本控制

参考文献