Parcourir la source

增加前后端分离Web端接口规范

李爱光 il y a 6 ans
Parent
commit
6614792a6a
1 fichiers modifiés avec 193 ajouts et 0 suppressions
  1. 193 0
      规范/接口/Web端前后端接口设计规范.md

+ 193 - 0
规范/接口/Web端前后端接口设计规范.md

@@ -0,0 +1,193 @@
+# Web端前后端分离接口设计规范
+######版本号:V0.0.1
+
+## 基本规范
+参考链接:[RESTful API 最佳实践](http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html)
+
+* 统一使用RESTful风格的接口请求方式,前端需要模拟除`GET`,`POST`以外的请求:
+	- `GET`:读取请求,如列表,详情接口
+	- `POST`:创建请求,如新增一条数据
+	- `PUT`:更新(Update),通常更新整个实体
+	- `PATCH`:部分更新
+	- `DELETE`:删除
+* URI统一使用资源实体的方式定义,资源实体统一定为英文单词的复数形式,筛选参数使用查询字段,以用户(User)实体为例
+	- `GET /users`:读取用户列表
+	- `GET /users?page=1&size=10`:分页读取用户列表(第1页,每页10条数据)
+	- `GET /users/1`:读取id为1的用户详情
+	- `GET /users?source=wechat`:读取来自微信的用户
+	- `POST /users`: 创建用户
+	- `PATCH /users/1`:更新id为1的用户信息
+	- `DELETE /users/1`:删除id为1的用户信息
+	- `GET /users/1/followers`:读取id为1的用户的粉丝列表
+* 统一重写HTTP状态码标识请求状态成功或失败,返回数据里不再有字段表示成功或失败,也不再有字段标识错误代码,前端需要遵循ES6规范,构建Promise对象进行ajax请求,ES6 Promise对象实现示例如下:
+
+```Javascript
+var getJSON = function(url) {
+  var promise = new Promise(function(resolve, reject){
+    var client = new XMLHttpRequest();
+    client.open("GET", url);
+    client.onreadystatechange = handler;
+    client.responseType = "json";
+    client.setRequestHeader("Accept", "application/json");
+    client.send();
+
+    function handler() {
+      if (this.readyState !== 4) {
+        return;
+      }
+      if (this.status === 200) {
+        resolve(this.response);
+      } else {
+        reject(new Error(this.statusText));
+      }
+    };
+  });
+
+  return promise;
+};
+
+getJSON("http://rap.taobao.org/mockjs/9768/Rap/get").then(function(response) {
+  console.log('Contents: ',response);
+}, function(error) {
+  console.error('出错了', error);
+});
+```
+
+- 2XX均表示请求成功:
+	 - `GET`:200,成功
+	 - `POST`:201,创建成功
+	 - `PUT`:200,成功
+	 - `PATCH`:200,成功
+	 - `DELETE`:204,已删除
+	 - 异步处理:202,服务器已接收到请求,处于待处理状态(如异步操作)。
+- 3XX表示重定向:在前后端分离时由前端控制是否跳转
+	- `301`:永久重定向,浏览器直接跳转
+	- `302`、`307`:暂时重定向,浏览器直接跳转
+	- `303`:暂时重定向,指定跳转URL,前端询问用户是否跳转,如
+		
+		```
+		HTTP/1.1 303 See Other
+		Location: /users/1
+		```	
+		
+- 4XX状态码,表示前端错误
+	- `400 Bad Request`:无效请求,服务器不理解前端请求
+	- `401 Unauthorized`:用户没有提供身份凭证凭据或没有通过身份验证(如未登录,登录信息失效)
+	- `403 Forbidden`:用户通过了验证,但是不具有访问资源所需的权限(数据权限)
+	- `404 Not Found`:请求资源不存在或不可用(如已删除资源)
+	- `405 Method Not Allowed`:用户已通过验证,但是所用的HTTP方法不在他的权限范围内(功能权限)
+	- `410 Gone`:资源已从该地址转移,不再可用(如文件转移)
+	- `415 Unsupported Media Type`:客户端要求的返回格式不支持,如只能返回JSON格式,客户端要求返回XML格式。
+	- `422 Unprocessed Entity`:客户端上传的附件无法处理,导致请求失败。
+	- `429 Too Many Requests`:客户端请求的次数超过限额。
+- 5XX状态码,服务端错误。要求服务端出错时要捕获异常,提供友好的信息给前端,不暴露异常信息到前端。
+	- `500 Internal Server Error`:客户端请求有效,服务器处理出现异常(如SQL执行错误,程序执行异常)
+	- `503 Service Unavailable`:服务器无法处理请求,通常用于网站维护状态
+
+## 参数约定
+### 请求参数约定
+__常用的请求参数必须使用下表约定的字段,不允许自定义。__
+
+| 名称           | 参数名 | 数据类型   | 备注         |
+|:-------------:|:----------:|:---------:|:----------------------------|
+| 分页页码       | page       | int       |   第一页从1开始               |
+| 分页大小       | size       | int       |   默认值为20,最大不能超过100   | 
+| 性别          | gender        |  string   |   male=男,female=女          |
+| 模糊搜索关键字  | keywords   |  string   |   仅针对同时支持多个字段模糊检索的,如同时从商品名称和商品详情中搜索的字段   |
+| 身份证号       | id_card    |  string   |   特指中国大陆身份证号,前端对输入的身份证号要进行规则校验     |
+| 手机号        | mobile      |  string   |   特指中国大陆手机号(支持加+86),前端对输入的手机号要进行规则校验  |
+| 电话号码       | telephone  |  string   |   包括手机号,400,800,955xx,100xx,固定电话等号码,前端要对表单数据进行规则校验  |
+| 姓名          | name        |  string   |   真实姓名          |
+| 昵称          | nickname    |  string   |   网络昵称          |
+| 邮箱          | email       |  string   |   前端需要针对邮箱地址进行校验  |
+| 验证码        | captcha      |  string   |   包括短信验证码,输入校验验证码  |
+| 经度         | longitude    |  float    |   精确到小数点后6位小数  |
+| 纬度         | latitude     |  float    |   精确到小数点后6位小数  |
+| 唯一编号      | __实体名___id |  int      |   如用户编号,使用user_id,分类编号使用category_id  |
+
+### 返回格式约定
+返回数据遵循ES6的规范,前端能够通过返回数据构建`Promise`对象进行处理。
+
+__常用的返回参数必须使用下表约定的字段,不允许自定义。__
+#### 成功返回数据
+
+| 名称           | 参数名 | 数据类型   | 备注         |
+|:-------------:|:----------:|:---------:|:----------------------------|
+| 数据集合       | data       | Object     |   返回的数据库实体数据及其业务相关数据,不同的实体分多个json对象返回               |
+| 其他数据       | meta       | Object     |   与业务不相关的数据,如分页信息 | 
+
+示例数据如下:
+
+```
+{
+    data: {
+        user: {
+            id: 1, 
+            real_name: "root", 
+            gender_txt: "女士", 
+            staff_code: "96582", 
+            last_logined_endpoint_txt: "网站", 
+            last_logined_at: {
+                date: "2018-12-26 11:21:40.000000", 
+                timezone_type: 3, 
+                timezone: "Asia/Shanghai"
+            }, 
+            staff_status_txt: "在职", 
+            account_status_txt: "正常"
+        }, 
+        token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xMjQuMjI1LjE1OS45Mzo4MDcwXC9hcGlcL2F1dGhlbnRpY2F0ZSIsImlhdCI6MTU0NTc5NDUwMCwiZXhwIjoxNTQ1OTAyNTAwLCJuYmYiOjE1NDU3OTQ1MDAsImp0aSI6Im5WTW52akU4VUhNeGJ5bk8iLCJzdWIiOjEsInBydiI6ImUwNjRlZTA4YjM3N2ZlM2I2NTVmZmJmZjBkODBkMzQzN2IwZmY1ZDAifQ.BmQTGJB_TOIoATaqGj799wJKIwjO7oevj1d8XpFAFo4"
+    }
+}
+```
+ 
+分页返回示例
+  
+```
+ {
+    data: [
+        {
+            id: 10, 
+            residence_name: "in placeat", 
+            residence_logo: null, 
+            buildings_count: 0, 
+            units_count: 0, 
+            houses_count: 0, 
+            householders_count: 0
+        }
+    ], 
+    meta: {
+        current_page: 1, 
+        from: 1, 
+        last_page: 1, 
+        path: "http://124.225.159.93:8070/api/residences", 
+        size: 10, 
+        to: 1, 
+        total: 1
+    }
+}
+```
+
+
+
+#### 失败返回数据
+| 名称           | 参数名 | 数据类型   | 备注         |
+|:-------------:|:----------:|:---------:|:----------------------------|
+| 就绪状态       | readyState | int        |   4=已就绪,服务端已完成响应 |
+| 请求状态码     | status     | int        |   参考http状态码返回 |
+| 状态码描述     | statusTest     | String |   http状态码返回对应的英文描述,如Unauthorized, Bad Request等  |
+| 响应文本      | responseText     | String |   响应JSON数据的文本 |
+| 响应JSON数据  | responseJSON | Object    |   响应JSON数据,其中必须包含message字段,标识错误提示信息 |
+ 
+示例数据如下:
+
+```
+ {
+    readyState: 4, 
+    responseText: "{\"message\":\"\\u624b\\u673a\\u53f7\\u6216\\u5bc6\\u7801\\u9519\\u8bef\"}", 
+    responseJSON: {
+        message: "手机号或密码错误"
+    }, 
+    status: 401, 
+    statusText: "Unauthorized"
+}
+```