RESTful 接口设计规范-个人总结

RESTful 接口设计规范-个人总结

以下接口规范为个人收集并总结,仅供参考。欢迎提供建议

使用名词,使用HTTP 请求方法

接口中不要出现动词,以及动作。

使用HTTP 请求方法作为动作的表达。常见的CRUD,在HTTP 中都有对应的方法,可参考https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods

HTTP 请求方法

表格来自:https://www.runoob.com/http/http-methods.html

方法描述
GET请求指定的页面信息,并返回实体主体。
HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。
PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

有以下几种:GETPOSTPUTDELETEPATCH。与资源相关联的端点的名称必须与应用的操作相关的HTTP方法对应。

// bad case
GET /get_users
POST /insert_users
PUT /modify_users
DELETE /delete_users// good case
GET /users
POST /users
PUT /users
DELETE /users

日常开发中不一定能保证完全按照HTTP 请求方法的规范,但至少要保证请求方法使用GET,其他使用POST

全部小写

RFC 3986 将 URI 定义为区分大小写,对于不同环境,大小写 URI 代表不同的路径,为了避免混淆,建议在 URI 中应始终使用小写字母。

// bad case
/Users/12345// good case
/users/12345

使用斜杠 / 表示层次关系

斜杠/ 通常用于资源的所属关系,后面的属于前面的。这点类似面相对象语言中的.

例如:/users/{userId}/address/{userId}属于usersaddress属于{userId}

使用连字符 - 提高可读性

如果有多个单词,首先建议是使用/来区分层级关系,如果无法做到,则建议使用-区分

// bad case
/users/{userId}/pendingorders// good case
/users/{userId}/pending-orders

不要使用下划线_

虽然可以用下划线_ 代替连字符 - 作为分隔符,但有些应用程序的字体,下划线 _ 字符可能会在某些浏览器或屏幕中部分被遮住或完全遮住。

为避免这种混淆,建议使用连字符 - 而不是下划线 _

// bad case
/users/{userId}/pending_orders// good case
/users/{userId}/pending-orders

不用扩展名

除非直接访问文件,或者下载文件,否则不要使用文件扩展名(例如.xlsx

如果需要指定内容的格式,建议使用Content-Type

// bad case
/users/{userId}/pending-orders.xlsx// good case
/users/{userId}/pending-orders
Content-Type:application/vnd.ms-excel;charset=utf-8;

单数还是复数

如果能唯一确定的资源,则用单数,如果不能,则用复数。

如果单复数都行的,则用复数,因为单数也是复数的特殊形式,为了保持兼容与统一,所以建议复数。

// bad case
GET /user/{userId}
GET /users?sex=man// good case
GET /users/{userId}
GET /users/{userId}/address

精简

减少无用信息,提高信息密度,

// bad case
GET /service/api/search// good case
GET /search

不要暴露服务器的技术栈

技术栈包括使用了服务器、中间件、开发语言以及目录和系统结构等。这些建议不要暴露出来,一方面是有安全隐患,另一方面接口使用方也不关心,冗余不符合精简原则

// bad case
/cgi-bin/get_user.php?user=100// good case
/users?user=100

多条件查询(搜索)

多条件查询时,要求使用?拼接参数查询

例如:/users?location=shenzhen&sex=man 查找位于 shenzhen 的并且sex=man的所有用户

到底用时/还是?

  • 只有一个筛选条件,并且能唯一确定对象,则用/,比如/users/{userId}
  • 有多个筛选条件,并且不能唯一确定对象,尤其是多条件搜索的情况,就用?比如/users?sex=man

注意:只有一个筛选条件时,这里说的唯一,不仅包括单一对象,也包括集合

比如

  • URL“/users/2023/”返回的页面为2023年的存档
  • URL“/users/2023/10/”返回的页面为2023年10月的存档
// bad case
GET /users/id={userId}
GET /users/{userId}?sex=man// good case
GET /users/{userId}
GET /users?localtion=shenzhen&sex=man

例子

// 单个条件,唯一确定
https://www.zhihu.com/people/zhihusucks
https://space.bilibili.com/11083481
https://weibo.com/3266943013// 多个条件(搜索)
https://www.zhihu.com/search?q=123&type=content
https://www.zhihu.com/search?q=123&type=people

分页与排序支持

分页与排序也当做筛选条件放在?后面

  • GET /users?limit=10&offset=0 :分页,从0行开始返回10条。
  • GET /users?limit=10&offset=0&sort=asc&order=title :排序,返回按名称升序排列的文章记录。

如何表示列表

当没有层次关系时(如在列表中),应该使用分号之类的标点符号或者常见的逗号。

例如:/users/{id1},{id2} 访问多个用户资源。

前端路由与域名相同问题

有时候前端的路由地址会与后端的接口相同,会造成困扰、无法区分到底是前端路由还是后端的接口,调试的时候也会很麻烦。

所以建议有两种方案,后端接口后者统一加/api/,或者后端提供的接口统一使用二级域名api.xx.com

状态码

众所周知,HTTP有自己的状态码,比如下述列表,那我们自己的业务的错误码或者状态码,应该直接复用HTTP的状态码,还是自定义呢?

HTTP 状态码分类

表格来源:https://www.runoob.com/http/http-status-codes.html

HTTP 响应状态码由三个数字组成,第一个数字定义了状态码的类型。

响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599):

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

结论:业务异常不要使用HTTP的状态码,而要统一放在HTTP 200状态码下面,使用自定义的业务状态码。原因如下

下述结论大部分来自:

https://www.zhihu.com/question/513865370/answer/2643896815

https://www.zhihu.com/question/310737821/answer/585641618

如果业务状态码使用HTTP的状态码,那么会有如下问题

排查困难、分工混乱:一般HTTP的错误码(比如404)都是由服务器或者框架层面抛出的,并且大部分公司的运维与业务开发是分开的,运维只关心服务器层面的异常,业务开发只关心业务异常。如果不区分状态码,那么出现一个404的异常,就无法一眼看出来到底是谁的职责,还得进一步爬log,看错误信息才能确定问题,排查问题困难。如果区分的很清楚,则HTTP状态码的问题直接找运维,自定义的业务异常则直接找业务开发,再具体点就是HTTP200的异常去找业务开发,非HTTP200找运维。

扩展性差:HTTP那点状态码支撑不起众多的业务场景,比如404表示找不到,业务中存在多种找不到的情况,比如“用户找不到”、“订单找不到”、“商品找不到”等情况,如果都用404,那排查问题还是很困难。

运营商劫持:非200状态码(比如404、500)可能会被运营商劫持。或者其他开发人员除了200之外的状态码不认识,还有反向代理或者CDN都有可能有问题

接口出参格式

这里可参考Ant Design Pro的统一规范,这里截取一部分

{"success": true,"data": {},"errorCode": "1001","errorMessage": "error message","showType": 2,"traceId": "someid","host": "10.1.1.1"
}

参考

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

https://restfulapi.net/resource-naming/

https://www.runoob.com/http/http-tutorial.html

https://pro.ant.design/zh-CN/docs/request/#%E7%BB%9F%E4%B8%80%E8%A7%84%E8%8C%83

https://www.zhihu.com/question/31363461

https://www.zhihu.com/question/513865370

https://www.zhihu.com/question/310737821

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器跨域及--disable-web-security无效解决办法

谷歌浏览器跨域设置 (1)创建一个目录,例如我在C盘创建MyChromeDevUserData文件夹 (2) 在桌面选择谷歌浏览器右键 -> 属性 -> 快捷方式 -> 目标,添加--disable-web-security --user-data-dirC:\M…

软件测试基础知识 + 面试理论(超详细)

一、什么是软件? 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试? 说法一:使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异…

如何设计 API?

在前后端分离的设计中,不管使用什么语言,后端都需要提供 WebAPI 给前端使用。如果是一个平台级的产品,还有可能需要将平台的公共 API 提供给第三方系统使用,这些都要考虑到 API 的设计。 本文聊下 API 设计可能遇到的问题以及处理…

uni-app实现拍照功能

直接些这样的组件代码 <template><view><button click"takePhoto">拍照</button><image :src"photoUrl" v-if"photoUrl" mode"aspectFit"></image></view> </template><script&g…

DataCon【签到题】挖矿流量检测

【签到题】挖矿流量检测 文章目录 答案【多选】1. 个人电脑中了挖矿病毒通常有以下哪些表现&#xff1f;【单选】2. 在典型挖矿场景中&#xff0c;矿工和矿池之间目前最常用的通信协议是哪一个&#xff1f;【单选】3. 目前的虚拟货币挖矿场景中&#xff0c;最常采用的是哪种共识…

硬盘的简单介绍

硬盘的简单介绍 硬盘是服务器托管用户主机主要的数据存储介质。目前硬盘的种类有三类&#xff0c;不同的选择方案也会有不同的优劣对比。下面讲讲他们之间有什么不同吧 固态硬盘&#xff1a;  用固态电子存储芯片阵列而制成的硬盘&#xff0c;由控制单元和存储单元组成。固态…

开发工具分享 - Mybatis SQL日志格式化H5

目录 一、 序言二、代码示例三、部署至Nginx 一、 序言 平时通过IDEA开发&#xff0c;可以直接装相关MybatisLogFormat的插件直接对控制台里的Mybatis SQL日志进行格式化。一旦离开本地环境&#xff0c;到了测试或者线上&#xff0c;就得自己手动拼参数了。 简单的SQL还好&am…

【学习记录】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。用C语言编写

#include <iostream> #include<cstdlib> #include<ctime> using namespace std;// 我的代码所犯的错误记录&#xff1a; // 1. \n的换行打成了/n导致程序迟迟不能换行 // 2. rand()%4&#xff0c;是随机0~3的随机数&#xff0c;并不是0~4 // 3. 在main主函数…

数据模型设计必读方法论!很实用

数据架构的重要构件之一是数据模型&#xff0c;当然从数据架构的视角来说的数据模型是指企业级数据模型。本篇文章更多是讨论如何设计和管理数据模型&#xff0c;此处的数据模型是泛指在组织中通过数据建模的过程&#xff0c;来发现、分析和确定数据需求范围&#xff0c;并用于…

Hadoop3教程(十):MapReduce中的InputFormat

文章目录 &#xff08;87&#xff09;切片机制与MapTask并行度决定机制&#xff08;90&#xff09; 切片源码总结&#xff08;91&#xff09;FileInputFormat切片机制&#xff08;92&#xff09;TextInputFormat及其他实现类一览&#xff08;93&#xff09; CombineTextInputFo…

如何实现线程安全?

简单描述一下线程安全问题&#xff1a;在程序并发执行的过程中&#xff0c;对于临界区的一些共享数据&#xff0c;可能同时会有多个线程对其进行修改&#xff0c;造成数据覆盖、脏读等一系列问题 如何实现线程安全&#xff1f; 首先想到的就是实现线程同步&#xff0c;让并发…

ChatGPT生产力|实用指令(prompt)

GPT已经成为一个不可或缺的科研生产力了&#xff0c;但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料&#xff0c;本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息&#xff0c;帮人们解决更多问题。 …

移动端签名组件封装 借用插件 vue-esign

目录 需求实现讲解工具 - 图片旋转、base64 转换为 file 对象组件封装组件全局注册组件使用效果展示 需求 移动端需要实现手机横屏手写签名并上传签名图片功能。 实现讲解 vue-esign 插件文档地址 https://www.npmjs.com/package/vue-esign SignCanvas 组件封装原理&#xff1a…

数学建模——最优连接(基于最小支撑树)

一、概念 1、图的生成树 由图G(V,E)的生成子图G1(V,E1)(E1是E的子集&#xff09;是一棵树&#xff0c;则称该树为图G的生成树&#xff08;支撑树&#xff09;&#xff0c;简称G的树。图G有支撑树的充分必要条件为图G连通。 2、最小生成树问题 连通图G(V,E)&#xff0c;每条边…

OceanBase Oracle 模式下系统视图权限导致的故障一例

在 Oracle 和 OB Oracle 租户下调用存储过程时&#xff0c;两者表现并不一致&#xff0c;导致获取到的 SQL 文本拼接不完整&#xff0c;影响到了业务侧的功能测试。本文将针对这个问题进行相关的测试和验证。 作者&#xff1a;赵黎明&#xff0c;爱可生 MySQL DBA 团队成员&…

C语言实现// 输入一个英文句子,以‘ . ’结束,统计句子中包含的字符个数

完整代码&#xff1a; // 输入一个英文句子&#xff0c;以‘ . ’结束&#xff0c;统计句子中包含的字符个数 #include<stdio.h>int main(){char ch;int length0;printf("请输入一个英文句子\n");while (chgetchar()!.){length;}printf("字符个数是&…

开源CasaOS云软件发现关键漏洞

近日&#xff0c;开源 CasaOS 个人云软件中发现的两个严重的安全漏洞。该漏洞一旦被攻击者成功利用&#xff0c;就可实现任意代码执行并接管易受攻击的系统。 这两个漏洞被追踪为CVE-2023-37265和CVE-2023-37266&#xff0c;CVSS评分均为9.8分。 发现这些漏洞的Sonar安全研究…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权&#xff0c;所以安装了社区版的idea。不知道从何时开始&#xff0c;社区版IDEA的插件不好用了&#xff0c;所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后&#xff0c;点击生成就可以下载到一个完整的springboot项目了。 二 使用…

linux安装达梦数据库(命令行安装)

安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id&#xff08;GID&#xff09; 12345&#xff1a; 指定的组名称 dinstall &#xff1a; 组名 2,创建安装用户dmdba [rootdmDMSe…

Mycat2 分布式数据库中间件

一.安装部署 Mycat2目前还不支持直接获取Docker镜像&#xff0c;需要自己通过Dockerfile打包镜像&#xff0c;其实这也是为了开发者考虑&#xff0c;比如一些个性化功能&#xff0c;如自定义分片等 Dockerfile FROM docker.io/adoptopenjdk/openjdk8:latestENV AUTO_RUN_DIR…