阿里开发手册 嵩山版-编程规约 (十一) 其它

简介: 这篇文章是《阿里开发手册 嵩山版》中关于前后端规约的部分,涵盖了前后端交互的API设计、数据格式、错误处理、安全性等关键编程规约,目的是确保前后端开发高效协同,提升软件交付质量。

**历史版本**

前言

《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册,当前的版本是**嵩山版**。现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量。比如:五花八门的错误码人为地增加排查问题的难度;数据库的表结构和索引设计缺陷带来的系统架构缺陷或性能风险;工程结构混乱导致后续项目维护艰难;没有鉴权的漏洞代码易被黑客攻击等等。所以本手册以 Java 开发者为中心视角,划分为编程规约、异常日志、单元测试、安全规约、MySQL 数据库、工程结构、设计规约七个维度,再根据内容特征,细分成若干二级子目录。

另外,依据约束力强弱及故障敏感性,规约依次分为【强制】、【推荐】、【参考】三大类。在延伸信息中,“说明”对规约做了适当扩展和解释;“正例”提倡什么样的编码和实现方式;“反例”说明需要提防的雷区,以及真实的错误案例。

手册的愿景是码出高效,码出质量。现代软件架构的复杂性需要协同开发完成,如何高效地协 同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶?对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。

我们已经在 2017 杭州云栖大会上发布了配套的 Java 开发规约 IDE 插件,下载量达到 162 万人次,阿里云效也集成了代码规约扫描引擎。次年,发布 36 万字的配套详解图书《码出高效》,本书秉持“图胜于表,表胜于言”的理念,深入浅出地将计算机基础、面向对象思想、JVM 探源、数据结构与集合、并发与多线程、单元测试等知识客观、立体地呈现出来。紧扣学以致用、学以精进的目标,结合阿里巴巴实践经验和故障案例,与底层源码解析融会贯通,娓娓道来。《码出高效》和《Java开发手册》稿费所得收入均捐赠公益事情,希望用技术情怀帮助更多的人。

编程规约

(十) 前后端规约

1.【强制】前后端交互的 API,需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体。

说明:

1)协议:生产环境必须使用 HTTPS。

2)路径:每一个API 需对应一个路径,表示 API 具体的请求地址:

a)代表一种资源,只能为名词,推荐使用复数,不能为动词,请求方法已经表达动作意义。

b)URL路径不能使用大写,单词如果需要分隔,统一使用下划线。

c)路径禁止携带表示请求内容类型的后缀,比如".json",".xml",通过accept 头表达即可。

3)请求方法:对具体操作的定义,常见的请求方法如下:

a)GET:从服务器取出资源。

b)POST:在服务器新建一个资源。

c)PUT:在服务器更新资源。

d)DELETE:从服务器删除资源。

4)请求内容:URL 带的参数必须无敏感信息或符合安全要求;body 里带参数时必须设置 Content-Type。

5)响应体:响应体 body 可放置多种数据类型,由 Content-Type 头来确定。

2.【强制】前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合{}。

说明:此条约定有利于数据层面上的协作更加高效,减少前端很多琐碎的 null 判断。

3.【强制】服务端发生错误时,返回给前端的响应信息必须包含 HTTP 状态码,errorCode、errorMessage、用户提示信息四个部分。

说明:四个部分的涉众对象分别是浏览器、前端开发、错误排查人员、用户。其中输出给用户的提示信息

要求:简短清晰、提示友好,引导用户进行下一步操作或解释错误原因,提示信息可以包括错误原因、上 下文环境、推荐操作等。 errorCode:参考附表 3。errorMessage:简要描述后端出错原因,便于错误排查人员快速定位问题,注意不要包含敏感数据信息。

正例:常见的 HTTP 状态码如下

1)200 OK: 表明该请求被成功地完成,所请求的资源发送到客户端。

2)401 Unauthorized: 请求要求身份验证,常见对于需要登录而用户未登录的情况。

3)403 Forbidden:服务器拒绝请求,常见于机密信息或复制其它登录用户链接访问服务器的情况。

4)404 Not Found: 服务器无法取得所请求的网页,请求资源不存在。

5)500 Internal Server Error: 服务器内部错误。

4.【强制】在前后端交互的 JSON 格式数据中,所有的 key 必须为小写字母开始的 lowerCamelCase 风格,符合英文表达习惯,且表意完整。

正例:errorCode / errorMessage / assetStatus / menuList / orderList / configFlag

反例:ERRORCODE / ERROR_CODE / error_message / error-message / errormessage / ErrorMessage / msg

5.【强制】errorMessage 是前后端错误追踪机制的体现,可以在前端输出到 type="hidden" 文字类控件中,或者用户端的日志中,帮助我们快速地定位出问题。

6.【强制】对于需要使用超大整数的场景,服务端一律使用 String 字符串类型返回,禁止使用Long 类型。

说明:Java 服务端如果直接返回 Long 整型数据给前端,JS 会自动转换为 Number 类型(注:此类型为双精度浮点数,表示原理与取值范围等同于 Java 中的 Double)。Long 类型能表示的最大值是 2 的 63 次方-1,在取值范围之内,超过 2 的 53 次方 (9007199254740992)的数值转化为 JS 的 Number 时,有些数值会有精度损失。扩展说明,在 Long 取值范围内,任何 2 的指数次整数都是绝对不会存在精度损失的,所以说精度损失是一个概率问题。若浮点数尾数位与指数位空间不限,则可以精确表示任何整数,但很不幸,双精度浮点数的尾数位只有 52 位。

反例:通常在订单号或交易号大于等于 16 位,大概率会出现前后端单据不一致的情况,比如,"orderId": 362909601374617692,前端拿到的值却是: 362909601374617660。

7.【强制】HTTP 请求通过 URL 传递参数时,不能超过 2048 字节。

说明:不同浏览器对于 URL 的最大长度限制略有不同,并且对超出最大长度的处理逻辑也有差异,2048字节是取所有浏览器的最小值。

反例:某业务将退货的商品 id 列表放在 URL 中作为参数传递,当一次退货商品数量过多时,URL 参数超长,传递到后端的参数被截断,导致部分商品未能正确退货。

8.【强制】HTTP 请求通过 body 传递内容时,必须控制长度,超出最大长度后,后端解析会出错。

说明:nginx 默认限制是 1MB,tomcat 默认限制为 2MB,当确实有业务需要传较大内容时,可以通过调大服务器端的限制。

9.【强制】在翻页场景中,用户输入参数的小于 1,则前端返回第一页参数给后端;后端发现用户输入的参数大于总页数,直接返回最后一页。

10.【强制】服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护不一致的问题。

11.【推荐】服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的请求结果。

说明:缓存有利于减少交互次数,减少交互的平均延迟。

正例:http 1.1 中,s-maxage 告诉服务器进行缓存,时间单位为秒,用法如下,

response.setHeader("Cache-Control", "s-maxage=" + cacheSeconds);

12.【推荐】服务端返回的数据,使用 JSON 格式而非 XML。

说明:尽管 HTTP 支持使用不同的输出格式,例如纯文本,JSON,CSV,XML,RSS 甚至 HTML。如果我们使用的面向用户的服务,应该选择 JSON 作为通信中使用的标准数据交换格式,包括请求和响应。此外,application/JSON 是一种通用的 MIME 类型,具有实用、精简、易读的特点。

13.【推荐】前后端的时间格式统一为"yyyy-MM-dd HH:mm:ss",统一为 GMT。

14.【参考】在接口路径中不要加入版本号,版本控制在 HTTP 头信息中体现,有利于向前兼容。

说明:当用户在低版本与高版本之间反复切换工作时,会导致迁移复杂度升高,存在数据错乱风险。

相关文章
|
6天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
1月前
|
JSON 缓存 前端开发
阿里开发手册 嵩山版-编程规约 (十) 前后端规约
《阿里开发手册 嵩山版》中关于前后端规约的部分,涵盖了前后端交互的API设计、数据格式、错误处理、安全性等关键编程规约,目的是确保前后端开发高效协同,提升软件交付质量。
 阿里开发手册 嵩山版-编程规约 (十) 前后端规约
|
1月前
|
IDE 安全 Java
阿里开发手册 嵩山版-编程规约 (九) 注释规约
《阿里开发手册 嵩山版》中关于注释规约的部分,强调了注释的重要性和编写规范,包括Javadoc的使用、类和方法注释的要求、以及如何有效使用注释来提高代码的可读性和维护性。
 阿里开发手册 嵩山版-编程规约 (九) 注释规约
|
1月前
|
IDE 安全 Java
阿里开发手册 嵩山版-编程规约 (三)代码格式
《阿里开发手册 嵩山版》的编程规约部分详细介绍了代码格式规范,包括括号使用、空格、注释、行数限制等,旨在提高代码的可读性和维护性。
|
1月前
|
设计模式 安全 Java
阿里开发手册 嵩山版-编程规约 (一)命名规范
该文章主要介绍了阿里开发手册嵩山版中关于编程规约的命名规范,包括代码命名的强制和推荐规定,以及接口、类、枚举等的命名规则和各层命名规约等内容。
 阿里开发手册 嵩山版-编程规约 (一)命名规范
|
1月前
|
安全 Java 测试技术
阿里开发手册 嵩山版-编程规约 (七)并发处理
《阿里开发手册 嵩山版》中关于并发处理的编程规约并发处理部分,涵盖了线程安全、线程池使用、锁机制、并发工具类使用等最佳实践,旨在指导开发者高效、安全地处理并发问题。
|
1月前
|
存储 安全 Java
阿里开发手册 嵩山版-编程规约 (六)集合处理
《阿里开发手册 嵩山版》Java编程中的集合处理规范和最佳实践,旨在提升代码质量和开发效率。
|
1月前
|
安全 Java 测试技术
阿里开发手册 嵩山版-编程规约 (八)控制语句
这篇文章是《阿里开发手册 嵩山版》中关于控制语句的编程规约部分,提供了代码编写中控制流语句使用的最佳实践,包括switch-case、if-else、循环等语句的使用规范,以提升代码的可读性和健壮性。
|
1月前
|
安全 Java 程序员
阿里开发手册 嵩山版-编程规约 (四)OOP规约-Java程序员必看知识点!!!
《阿里开发手册 嵩山版》的OOP规约部分强调了面向对象编程的最佳实践,包括正确使用静态方法、覆写方法的注解、可变参数的使用、接口的稳定性、equals和compareTo方法的使用、BigDecimal的正确比较、包装类与基本数据类型选择、POJO类的属性和方法设计等,以提升代码的质量和维护性。
|
1月前
|
安全 Java 测试技术
阿里开发手册 嵩山版-编程规约 (五)日期时间的规范
《阿里开发手册 嵩山版》的日期时间规范部分提供了关于日期时间处理的强制性和推荐性规约,包括日期格式化、时间获取、避免硬编码日期、处理闰年问题等,以确保程序在时间处理上的准确性和稳定性。