阅读更多

9顶
1踩

Web前端

转载新闻 前后端完全分离之API设计

2015-04-28 10:45 by 副主编 mengyidan1988 评论(12) 有17146人浏览
API就是开发者使用的界面。我的目标不仅是能用,而且好用, 跨平台(PC, Android, IOS, etc…)使用:本文将详细介绍API的设计及异常处理,并将异常信息进行封装友好地反馈给前端。

上篇文章前后端完全分离初探只是讲了些宽泛的概念,接下来的文章将直接上干货,干货的源码会挂在github上。

前后端完全分离后, 前端和后端如何交互?

答: 通过双方协商好的API。

接下来我分享我自己设计的API接口, 欢迎各位朋友指教。

API设计理念
1.将涉及的实体抽象成资源, 即按id访问资源, 在url上做文章, 以后再也不用为url起名字而苦恼了。
2.使用HTTP动词对资源进行CRUD(增删改查); get->查, post->增, put->改, delete->删。
3.URL命名规则, 对于资源无法使用一个单数名词表示的情况, 我使用中横线(-)连接。
  • 资源采用名词命名, e.g: 产品 -> product
  • 新增资源, e.g: 新增产品, url -> /product , verb -> POST
  • 修改资源, e.g: 修改产品, url -> /products/{id} , verb -> PUT
  • 资源详情, e.g: 指定产品详情, url -> /products/{id} , verb -> GET
  • 删除资源, e.g: 删除产品, url -> /products/{id} , verb -> DELETE
  • 资源列表, e.g: 产品列表, url -> /products , verb -> GET
  • 资源关联关系, e.g: 收藏产品, url -> /products/{id}/star , verb -> PUT
  • 资源关联关系, e.g: 删除收藏产品, url -> /products/{id}/star , verb -> DELETE

目前我API的设计只涉及这两点, 至于第三点HATEOAS(Hypermedia As The Engine Of Application State)那就由读者自己去选择了。
项目地址

本文中只涉及了设计的理念,具体的实现请下载源码rest-api,项目内写了比较详细的注释。

项目实战

实战将从业务场景出发,详细介绍如何使用HTTP verb对资源进行操作(状态转移),使用JSON返回结果(资源表述),并定义JSON的基础结构。
JSON结构

requestParams:
{
}

responseBody:
{
  "meta": {
  },
  "data": {
  }
}

meta中封装操作成功或失败的消息, data中封装返回的具体数据.

当新建商品或更新产品时, 相关属性封装在JSON中, 通过POST或PUT发送,
{
  "name": "Apple Watch SPORT",
  "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
}

当用户对商品进行操作后, 将得到响应结果,

GET, POST, PUT操作成功, 返回如下结果
{
  "meta": {
    "code": 201,
    "message": "创建成功"
  },
  "data": {
    "id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
    "name": "Apple Watch SPORT",
    "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
  }
}

DELETE操作成功, 返回如下结果
{
  "meta": {
    "code": 204,
    "message": "删除成功"
  }
}

业务场景一

电商网站的管理员对商品进行新增,编辑,删除,浏览的操作; 暂时不考虑认证授权, 只关注对商品的操作.

为了以后便于做分布式, 所有资源id(表主键)均采用uuid.

新增商品

1, url: /api/product

2, method: POST

3, requestParams:
{
  "name": "Apple Watch SPORT",
  "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
}

4, responseBody
{
  "meta": {
    "code": 201,
    "message": "创建成功"
  },
  "data": {
    "id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
    "name": "Apple Watch SPORT",
    "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
  }
}

编辑商品

1, url: /api/products/{id}

2, method: PUT

3, requestParams:
{
  "name": "iPhone 6",
  "description": "此次苹果发布会发布了iPhone 6与iPhone 6 Plus,搭载iOS 8,尺寸分别是4.7和5.5英寸。外观设计不再棱角分明,表层玻璃边有一个弧度向下延伸,与阳极氧化铝金属机身边框衔接。机身背部采用三段式设计。机身更薄,续航能力更强。"
}

4, responseBody
{
  "meta": {
    "code": 200,
    "message": "修改成功"
  },
  "data": {
    "id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
    "name": "iPhone 6",
    "description": "此次苹果发布会发布了iPhone 6与iPhone 6 Plus,搭载iOS 8,尺寸分别是4.7和5.5英寸。外观设计不再棱角分明,表层玻璃边有一个弧度向下延伸,与阳极氧化铝金属机身边框衔接。机身背部采用三段式设计。机身更薄,续航能力更强。"
  }
}

删除商品

1, url: /api/products/{id}

2, method: DELETE

3, responseBody
{
  "meta": {
    "code": 204,
    "message": "删除成功"
  },
  "data": {}
}

获取商品详情

1, url: /api/products/{id}

2, method: GET

3, responseBody

删除前
{
  "meta": {
    "code": 200,
    "message": "查询成功"
  },
  "data": {
    "id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
    "name": "Apple Watch SPORT",
    "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
  }
}

删除后
{
  "meta": {
    "code": 404,
    "message": "指定产品不存在"
  }
}

获取商品列表(未分页)

1, url: /api/products

2, method: GET

3, responseBody
{
  "meta": {
    "code": 200,
    "message": "获取全部商品成功"
  },
  "data": [
    {
      "id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
      "name": "Apple Watch SPORT",
      "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
    },
    {
      "id": "9db1992a-c342-4ff0-a2a4-aeb3dbfd93f6",
      "name": "Apple Watch SPORT",
      "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
    },
    {
      "id": "4481619b-45c5-4729-9539-f93bb01f10d8",
      "name": "Apple Watch SPORT",
      "description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
    }
  ]
}

业务场景二

业务场景一中只涉及了单个资源的操作, 但实际场景中还有些关联操作; 如用户去电商网站浏览商品, 并收藏 了一些商品, 之后又取消收藏 了部分商品.

暂时不考虑用户认证授权, 以后加了token后, 用户信息可以从中获取.

收藏商品

1, url: /api/products/{id}/star

2, method: PUT

3, responseBody
{
  "meta": {
    "code": 200,
    "message": "收藏商品[5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9]成功"
  },
  "data": [
    {
      "id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
      "name": "iPhone 6",
      "description": "此次苹果发布会发布了iPhone 6与iPhone 6 Plus,搭载iOS 8,尺寸分别是4.7和5.5英寸。外观设计不再棱角分明,表层玻璃边有一个弧度向下延伸,与阳极氧化铝金属机身边框衔接。机身背部采用三段式设计。机身更薄,续航能力更强。"
    }
  ]
}

取消收藏商品

1, url: /api/products/{id}/star

2, method: DELETE

3, responseBody
{
  "meta": {
    "code": 200,
    "message": "删除收藏商品[5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9]成功"
  },
  "data": []
}

自定义异常和异常处理

所有自定义异常继承RuntimeException, 在业务层抛出, 统一在Controller层进行处理.

异常分为全局异常和局部异常, 例如http method unsupported(405), unauthorized(401), accessDenied(403), not found(404)等属于全局异常; 针对对独立业务的一些异常属于局部异常, 例如产品编辑出错;

异常在Controller中进行处理, 并封装成json返回给前端, 封装后的数据如下, 相关实现见源码;
{
  "meta": {
    "code": 404,
    "message": "指定产品不存在"
  }
}

{
  "meta": {
    "code": 405,
    "message": "Request method 'POST' not supported"
  }
}

项目运行截图部分


  • 大小: 247.5 KB
来自: Arccode's blog
9
1
评论 共 12 条 请登录后发表评论
12 楼 zbm2001 2015-07-12 13:52
web原来就应该是这样的架构风格(rest),对于断层的人你解释了也不一定理解,主要靠自省
11 楼 mangguo 2015-04-30 09:39
挺不错的好东西。

==(⊙o⊙)来自汇智网至尊客户端!世界辣莫大,你还不会编程。
10 楼 Fatyu 2015-04-29 22:59
dxbj1010 写道
如果用spring的话,如何识别这些method了?requestMethod?

指定method方式
9 楼 zhangchengtest 2015-04-29 14:42
跟我的想法竟然这么的一致
8 楼 nicegege 2015-04-29 11:38
github的地址 有没?
7 楼 nicegege 2015-04-29 11:36
干货 好东西  谢谢分享!   
6 楼 Tyrion 2015-04-29 10:41
这篇文章是个系列,建议编辑把前后都发上来吧。
5 楼 QuarterLifeForJava 2015-04-29 09:09
Angular+bootstamp+spring restfull
数据库层用起来都不大爽,求大家推荐个
4 楼 dxbj1010 2015-04-28 21:10
如果用spring的话,如何识别这些method了?requestMethod?
3 楼 西南吹风 2015-04-28 16:36
restfull相当好用。企业应用分层架构模式下,restfull+json是个不二的选择。
2 楼 mangguo 2015-04-28 13:49
木有看懂是什么意思
1 楼 jinyanhui2008 2015-04-28 11:34
你要说明什么?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • ExtJs 3 自定义combotree

    ExtJs 3 自定义combotree /** * 自定义下拉树,支持初始化值时自动定位树节点。 * 还没有考虑性能问题。继承自Ext.form.ComboBox也很浪费。 * 代码中的cu.get()是自定义的异步请求方法。 * @author ...

  • Coolite之ComboTree控件附加与实际引用、取值

    看了N遍还没有明白那位老兄是怎么调用这个ComBoTree 控件。 说明:以上是comboTree.js 与ComboTree.cs的存放位置。 Code1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Component...

  • 【转载】Coolite之ComboTree控件附加与实际引用、取值

    Coolite之ComboTree控件附加与实际引用、取值 在发这个贴子之前,我想说几句话。强烈笔视~~那些只发代码不写怎么调用的XXX人。看了N遍还没有明白那位老兄是怎么调用这个ComBoTree 控件。 说明:以上是...

  • combotree的总结

    1:最近有这个需求,就是ext下的combo下拉是树,网上的例子很多,封装的也很好,基本都可以满足下拉框下出现想要的树,但是我的使用情况是比如在用户编辑的时候,要把用户已经选择过的数值自动再赋值到下拉框内,...

  • extjs tree checkbox 复选框实现 取值 显示

    原来做EXTTREE的复选其实很简单! 数据: [{id:'55',text:'节点11',leaf:false,checked:true} checked属性就是控制复选框是否出现,true出现复选框 false 不出现。     获取tree的选中值方法:...

  • combotree的总结(这个好)

    1:最近有这个需求,就是ext下的combo下拉是树,网上的例子很多,封装的也很好,基本都可以满足下拉框下出现想要的树,但是我的使用情况是比如在用户编辑的时候,要把用户已经选择过的数值自动再赋值到下拉框内,...

  • Extjs-表单与输入控件

    var editForm = new Ext.form.FormPanel({ labelWidth : 120, labelAlign : 'right', border : false, frame : true, trackResetOnLoad : true, anchor : '100%', bodyStyle : 'padding:5p

  • .2.【方法1】隐藏的弦图 (1)【课程出自拼多多店铺:北大网课资料店】

    .2.【方法1】隐藏的弦图 (1)【课程出自拼多多店铺:北大网课资料店】

  • 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5781.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5781.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5781.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

  • 毕业设计参考-本科毕设时做的遥感影像分类

    毕业设计参考-本科毕设时做的遥感影像分类 本科毕业设计中的遥感影像分类是一个涉及遥感技术、图像处理和机器学习等多个领域的项目。遥感影像分类是通过计算机技术对遥感图像中的不同地物进行识别和分类的过程。以下是一个基于遥感影像分类的本科毕业设计建议: ### 1. 需求分析 - **用户角色**:确定系统的主要用户角色,如遥感影像分析人员、决策支持者等。 - **核心功能**: - 遥感影像预处理:包括影像的校正、裁剪、增强等。 - 特征提取:从遥感影像中提取有助于分类的特征。 - 分类算法实现:实现一种或多种分类算法,如监督学习、无监督学习、深度学习等。 - 结果评估:评估分类结果的准确性和可靠性。 ### 2. 技术选型 - **遥感影像处理**:使用ENVI、ERDAS Imagine等遥感影像处理软件。 - **编程语言**:Python(TensorFlow、Keras、PyTorch等)。 - **数据库**:MySQL、Oracle或PostgreSQL等。 - **服务器**:Tomcat或Jetty。 - **开发工具**:Eclipse、IntelliJ

  • 2024年箱包皮具行业分析报告.pptx

    行业报告

  • VUE + nodejs实战

    VUE + nodejs实战

  • 某三层流水别墅建筑施工图水电图2g-qd-pm.dwg

    某三层流水别墅建筑施工图水电图2g-qd-pm.dwg

  • 2024嵌入式面试资料通用程序员简历模板700M

    2024嵌入式面试资料通用程序员简历模板700M提取方式是百度网盘分享地址

  • 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5790.170)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5790.170 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5790.170 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

  • 2024最新Simple Allow Copy中文版

    2024最新Simple Allow Copy中文版

  • 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5767.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5767.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5767.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

  • Linux 平台下基于 Rust + GTK 开发的音乐播放器

    Linux 平台下基于 Rust + GTK 开发的音乐播放器

  • 毕业设计-毕设:一个血压实时监控app

    毕设:一个血压实时监控app,该app主要功能为与测量设备进行通信,获取测量数据并在客户端进行处理,由服务器进行数据 分析,为用户提供健康评估及建议。 目标 实现与蓝牙设备通信,获取使用者的心率数据和血压数据 实现数据可视化 实现将数据上传到服务器,并进行进一步分析 实现其它辅助性功能:个人信息,设置等 在完成上述功能之后,可以进一步实现其它功能,例如测量光照,温度,振动等数据 已完成功能 蓝牙功能 可以打开蓝牙并连接到指定设备获取数据流。 数据图表 已完成图表UI设计以及模块功能搭建,已实现图表数据的数据库读取功能。 个人设置 已搭建好UI,完成个人信息页面全部功能。已完成全部网络通信接口。 搭建好数据库模块以及网络通信模块 数据库功能已经实现并抽象,网络通信功能也已实现并抽象,服务器初步搭建了框架。 服务器和客户端已完成了关于User数据 和测量数据的上传下载以及清空等一系列操作,本机已通过花生壳映射到外网作为测试服务器。 服务器已有比较简单的UI可供查 询指定用户的测量数据。 状态计算 根据监控数据(振动,屏幕控制)计算用户状态,客户端算法已初步完成。 一些附加功能 已完成监听加

  • 基于SSM+Mysql的在线投票系统(源码+需求分析+演示视频).zip

    java语言,ssm框架,mysql数据库 前台+后台 前台界面 WU 后台界面:CQA+CQB 内容页 P2 前台 投票须知(固定IP不可重复投票) 用户注册 用户可以发起投票(包括题目,选项,单选/多选等都可以自定义) 投票主题查看,可以收藏 在线投票(按照主题投票)登录后可以操作,支持单选及多选,投票结果查看,统计(图表形式) 查看投票结果,登录后可以操作 在线留言(包括留言和管理员回复) 后台 管理员 管理员管理 注册用户审核 投票须知管理 投票主题管理 投票内容管理(选项的删除和添加) 系统管理(可以实现项目的删除和编辑以及系统配置的更新) 注册用户 个人资料修改 我的收藏主题

Global site tag (gtag.js) - Google Analytics