前言

最近我司要制定开发规范。在讨论接口返回的时候,后端的同事询问我们前端,错误信息的返回,前端有什么意见?

所以做了一些调研给到后端的同事做参考。

错误信息返回

在使用API时无可避免地会因为各种情况而导致接口返回错误的信息。比如指定的query参数错误,又或者method不支持等,这些情况都会返回相关的错误信息。另外服务器不稳定或者停止运行了,也必须将错误信息返回。

显然,当错误发生的时候,只是笼统地返回“发生了错误”是不行的。如果前端不了解发生了什么错误,也就不知道该怎么去调试,怎么去修复这个bug。所以说,必须向前端返回尽可能多的信息,以便前端找到出错的地方解决问题。

通过HTTP状态码表示出错信息

首先必须选择合适的HTTP状态码,之前我司的后端API没有遵循这个规则。例如API无论如何访问,都会返回200状态码,只在返回消息体中的描述是否发生错误。

HTTP/1.1 200 OK
Content-Type: application/json{"error": {"code": 2002,"message": "Invalid parameter"}
}

虽然这么处理前端也能理解API的错误信息,但由于HTTP协议已经完整地定义了各个状态码所表示的含义,所以返回恰当的状态码才能提高前端正确识别错误的可能性。

如果出错了,仍然返回200状态码,有可能导致前端的处理发生混乱,这种情况要一定要禁止。特别是通用的API,基本上都是先看状态码再决定下一步的处理,如果没有返回正确的状态码,就会导致前端无法执行适当的方法去处理,从而引发各种不必要的问题。而且这种做法没有尽可能地运用HTTP协议,也给前端编写错误处理增加了难度。

  • 状态码分类
状态码 含义
1xx 消息
2xx 成功
3xx 重定向
4xx 前端原因引起的错误
5xx 服务器原因引起的错误

下面主要来了解一下4xx5xx的错误码:

4xx-前端发生了错误

4xx的状态码主要是用于描述因前端请求的问题而引发的错误,也就是说服务器端不存在出错问题,但服务器端无法理解前端的请求,或者能理解但无法处理的请求。这一类的错误,统一使用4xx错误码。

状态码 名称 说明
400 Bad Request 表示其他错误,就是4xx都无法描述的前端发生的错误
401 Authentication 表示认证类型的错误
403 Authorization 表示授权的错误(认证和授权的区别在于:认证表示“识别前来访问的是谁”,而授权则是“赋予特定用户执行特定操作的权限”)
404 Not Found 表示访问的数据不存在
405 Method Not Allowd 表示可以访问接口,但是使用的HTTP方法不允许
406 Not Acceptable 表示API不支持前端指定的数据格式
408 Request Timeout 表示前端发送的请求到服务器所需的时间太长
409 Confilct 表示资源发生了冲突,比如使用已被注册邮箱地址注册时,就引起冲突
410 Gone 表示访问的资源不存在。不单表示资源不存在,还进一步告知该资源该资源曾经存在但目前已消失
413 Request Entity Too Large 表示请求的消息体过长而引发的错误
414 Request-URI Too Large 表示请求的首部过长而引发的错误
415 Unsupported Media Type 表示服务器端不支持客户端请求首部Content-Type里指定的数据格式
416 Range Not Satisfiable 表示无法提供Range请求中的指定的那段包体
417 Expectation Failed 表示对于Expect请求头部期待的情况无法满足时的响应码
421 Misdirected Request 表示服务器认为这个请求不该发给它,因为它没能力处理
426 Upgrade Required 表示服务器拒绝基于当前HTTP协议提供服务,通过Upgrade头部告知客户端必须升级协议才能继续处理
428 Precondition Required 表示用户请求中缺失了条件类头部,例如If-Match
429 Too Many Requests 表示客户端发送请求的速率过快
431 Request Header Fields Too Large 表示请求的HEADER头部大小超出限制
451 Unavailable For Legal Reasons 表示由于法律原因不可访问

5xx-服务器端发生错误

5xx状态码表示错误由服务器端的问题引发的。

状态码 名称 说明
500 Internal Server Error 表示服务器内部错误,且不属于以下错误类型
501 Not Implemented 表示服务器不支持实现请求所需要的功能
502 Bad Gateway 代理服务器无法获取到合法资源
503 Service Unavailable 服务器资源尚未准备好处理当前请求
504 Gateway Timeout 表示代理服务器无法及时的从上游获得响应
505 HTTP Verson Not Supported 表示请求使用的HTTP协议版本不支持
507 Insufficient Storage 表示服务器没有足够的空间处理请求
508 Loop Detected 表示访问资源时检测到循环
511 Network Authentication Required 表示代理服务器发现客户端需要进行身份验证才能获得网络访问权限

向前端返回详细的错误信息

当错误发生时,除了需要返回相应的状态码之外,还需要返回详情的错误信息。因为状态码只是通用的描述错误的类别,一般无法表示实际发生的具体错误信息。

比如说400状态码,只是知道前端请求发生了错误,至于如何去修改,仅凭这个是没有办法找到bug的。

通常来说:返回错误信息的方法有两种:

  • 将信息放入HTTP响应头
  • 将信息通过HTTP响应体返回

1、通过自定义头部,将详细的错误信息放入响应头中

X-ERROR-CODE: 2020
X-ERROR-MESSAGE: Bad authentication token
X-ERROR-INFO: http://api.example.com/v1/authentication

2、将错误信息放入响应体中

{"error": {"code": 2020,"message": "Bad authentication token","info": "http://api.example.com/v1/authentication"}
}

从前端的角度来考虑,通过响应体返回会更加容易处理。

这里的错误代码的命名方式,按照后端自己的要求编写即可。

通常情况下,会要求接口的错误信息越详细越好,但这也不是一定的,也会有特殊情况。
一般而言,前端会将后端接口的错误信息原封不动的显示出来,因为前端很难去判断是否有涉密信息或者让用户难堪的信息。比如说A用户屏蔽了B用户,当B用户想看A用户的详情时,如果正确的返回:“A用户已屏蔽B用户,无法获取”的话,会让双方都难堪。这时就需要返回模棱两可的信息。这个就需要后端开发们自己去领悟。

针对默认返回与API维护

某些接口在发生错误时会将HTML返回。特别是发生404、503等错误时,这种情况就比较常见。当发生这些错误时,用于构建APIWeb服务器或者app框架会直接返回出错信息,默认情况下大都是HTML

但虽说是发生了错误,前端依然在访问中,所以仍然期待服务器返回约定好的格式,比如JSON。尤其在通过Accept请求头部或扩展名等指定了接收格式时。当然可以让前端去检查Content_Type头部,进行相应的处理。但如果前端处理的不好或者没有处理,可能会导致app崩溃。

尤其是公共api,不能期望所有的使用者都严格遵循规范来处理好,这种api算不上了好的api

关于API的维护,正常来说,要避免不得不停止API的发生。但特殊的时候也会不得不停止API进行维护工作,这种情况需要返回503状态码来告知前端当前API已经停止工作。另外,因为这种停止操作不是意外而是有计划进行的,所以要有API何时重启的时间信息,将其发送给前端。

不仅要预备好用于定期维护的状态码和出错信息的返回,还要使用Retry-After头部来告诉前端维护结束的时间。从SEO的角度来看,这个方式对普通的web站点的维护也同样适用,也是Google推荐的方法。

Retry-After的值可以是某个具体的日期或从当前时刻算起至可正常访问为止所需的秒数。

503 Service Temporarily Unavailable
Retry-After: Mon, 9 Sep 2020 20:00:00 GMT 

从前端实现的角度来看,在返回503错误时,是期待前端能识别出API地方Retry-After值指定的时间等待,然后在API重启的时候再次访问。

虽然这些处理都取决于前端的具体实现,后端无法对此进行控制,但依然要尽可能地返回详细的信息,方便前端处理并提升用户体验。

总结

主要是三个痛点:

  • 必须选择合适的HTTP状态码
  • 向前端返回详细的错误信息
  • 针对默认返回与API维护

作者: zhangwinwin
链接:后端API接口的错误信息返回规范
来源:github

后端API接口的错误信息返回规范相关推荐

  1. nginx学习笔记002---Nginx代理配置_案例1_实现了对前端代码的方向代理_并且配置了后端api接口的访问地址

    做个记录,以后做简单的nginx的时候拿过来就用 这个配置实现了,对前端html的方向代理,并且,配置了对后端api接口的方向代理 E:\nginx-1.14.0\conf\nginx.conf #u ...

  2. API接口:公司信息查询在线工具应用

    API接口:公司信息查询在线工具操作 接口简介:通过企业名称/社会统一信用代码/工商注册号三者其中之一快速查询全国企业工商数据,可查得企业工商基本信息.如:企业工商基本信息,企业法人,经营状态,注册资 ...

  3. 利用eoLinker快速录入Api接口文档信息

    传统的接口信息录入过程太过繁琐,而最近在线接口文档编写的平台变得越来越多,我参考了知乎上推荐的几款接口平台,eoLinker是用过几天之后觉得还不错的,特此记录一下如何通过它来实现快速录入Api接口文 ...

  4. 前后端API接口安全问题,防止抓包恶意请求

    哈喽,你们好,这是我第一次发帖子,最近遇到了一些关于后端api接口的安全问题,相信很多刚开始接触前后端的人都会遇到这样的问题,如果后端写了一个数据库操作的接口供前端使用,而这些接口无论是GET请求还是 ...

  5. 【编程规范】 后端API接口设计编写与文档编写参考

    文章目录 0 统一规范 0.1 理清业务流程 0.2 定义前后端开发的接口规范 0.3 定义接口文档 1 后端接口编写 1.0 后端接口介绍 1.0.1 接口交互 1.0.2 返回格式 1.0.3 C ...

  6. Drf从入门到精通一(API接口、Postman、Restful规范、序列化、快速使用drf、CBV源码分析)

    文章目录 一.前后端开发模式 二.API接口 三.接口测试工具Postman 四.Restful规范 五.序列化反序列化 六.DjangoRestFramework快速使用 七.CBV源码分析 一.前 ...

  7. java前端接口怎么写_如何写出优雅的后端API接口?

    目录前言 接口交互 返回格式 控制层Controller 美观优化 优雅优化 实现方案 总结 前言 在移动互联网,分布式.微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话 ...

  8. 看看人家那后端API接口写得,那叫一个优雅!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/tEvn 在移动互联网,分布式.微服务 ...

  9. 计算机前后端接口,看看别人后端API接口写得,那叫一个优雅!

    在分布式.微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式.题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟:以前后端人员瞧不起前端人员,那 ...

  10. 看看人家那后端API接口写得,那叫一个巴适~,再看看我的,像坨屎!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 作者:老顾聊技术 来源:to ...

最新文章

  1. 关于asp.net Session丢失问题的总结
  2. 自定义MIME类型支持FLV的相关设置
  3. 拼多多技术事故复盘,程序员应该学到什么?
  4. ansible(自动化运维中)——ansible常用模块
  5. asp.net 6中的mini api和mvc api性能对比
  6. 多米诺骨牌(洛谷-P1282)
  7. Spark基础学习笔记16:创建RDD
  8. PyTorch系列入门到精通——autograd与逻辑回归
  9. 艾伟_转载:扩展方法 之 基本数据篇
  10. 越优秀的人,越早想通透这七件事
  11. 手动解除浏览器跨域限制
  12. 《数据结构 严蔚敏C》期末高频考题整理(含详解)
  13. python学习笔记|SQLite数据库基本知识
  14. echarts如何在柱状图上显示百分比
  15. 身份证真伪的验证(C# / ASP.NET /JS代码)及算法说明
  16. android 刷recovery,安卓手机怎么刷入Recovery 命令行刷入Recovery教程
  17. 算法学习的一些个人心得
  18. 机器学习Class 6:分类及描述
  19. python span()函数_Python正则表达式六种函数实例讲解
  20. 推荐9款最佳的编程字体

热门文章

  1. 操作系统的主要功能(3)
  2. 360路由器设置网段ip
  3. 与dalao学校的联shou考wan(11.2)(dp+乱搞+树形dp+期望)
  4. Android开发中遇到的坑
  5. 所有失去的都会以另一种方式归来
  6. Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)
  7. 微信拉票之微信如何拉票及微信投票怎样拉票通过制作微信拉票群软件来辅助拉票
  8. 手机后端开发用php,【后端开发】php如何获取手机型号
  9. Hadoop Cascading简介
  10. 如何成为很厉害的程序员?- 读《精进》