REST API URI设计的7条规则

尾调苔藓
• 阅读 3653

REST API URI设计的7条规则

这七个简单的规则将帮助您编写可读的,无冲突的URI,以传达所有必要的资源信息。

REST API URI设计的7条规则通过

盖·莱文

在研究REST API URI设计的规则之前,让我们快速概述一下我们将要讨论的一些术语。

URIs

REST API使用统一资源标识符(URI)来寻址资源。在今天的网络,URI设计范围从明确传达,如API的资源模型杰作http://api.example.com/louvre/leonardo-da-vinci/mona-lisa
对那些更难为人们所了解,如http://api.example.com/68dd0-a9d3-11e0-9f1c-0800200c9a66

蒂姆·伯纳斯·李(Tim Berners-Lee)在他的“ Web体系结构公理”列表中包括有关URI不透明的注释:“唯一可以使用标识符的是引用对象。当不进行解引用时,您不应查看URI字符串的内容以获取其他信息。”

客户必须遵循Web的链接范例,并将URI视为不透明的标识符。

REST API设计人员应创建URI,以将REST API的资源模型传达给潜在的客户端开发人员。在本文中,我将尝试介绍REST APIURI的一组设计规则

在深入了解这些规则之前,本节介绍的有关URI格式的文字与URI的格式有关。RFC 3986定义了通用URI语法,如下所示:

URI = scheme "://" authority "/" path [ "?" query ] [ "#" fragment ]

规则1

URI中不应包含结尾的正斜杠(/)。

这是要遵循的最重要的规则之一,因为URI路径中的最后一个字符,正斜杠(/)不会增加语义值,并且可能引起混乱。REST API不应包含斜线,也不应将其包含在它们提供给客户端的链接中。

许多Web组件和框架将同等对待以下两个URI:

http://api.canvas.com/shapes/  
http://api.canvas.com/shapes

但是,URI中的每个字符都会计入资源的唯一标识。

两个不同的URI映射到两个不同的资源。如果URI不同,则资源也不同,反之亦然。因此,REST API必须生成并传递干净的URI,并且不应容忍任何客户端错误地识别资源的尝试。

更多宽容的API可以将客户端重定向到URI,而不会在末尾加反斜杠(它们也可能会返回301 –“永久移动”,用于重新定位资源”)。

规则2

必须使用正斜杠分隔符(/)表示层次关系。

URI的路径部分使用正斜杠(/)字符表示资源之间的层次关系。例如:http://api.canvas.com/shapes/polygons/quadrilaterals/squares

规则3

应使用连字符(-)来提高URI的可读性。

为了使您的URI易于人们扫描和解释,请使用连字符(-)来提高长路径段中名称的可读性。在英语中使用空格或连字符的任何地方,都应在URI中使用连字符。

例如:http://api.example.com/blogs/guy-levin/posts/this-is-my-first-post

规则4

URI中不应使用下划线(_)。

文本查看器应用程序(浏览器,编辑器等)通常在URI下划线,以提供可单击的可视提示。根据应用程序的字体,下划线(_)字符可能会被此下划线部分掩盖或完全隐藏。

为避免这种混淆,请使用连字符(-)代替下划线。

规则5

在URI路径中应首选小写字母。

方便时,URI路径中最好使用小写字母,因为大写字母有时会引起问题。RFC 3986将URI定义为区分大小写,但方案和主机组件除外。

例如:

1)http://api.example.com/my-folder/my-doc

2)HTTP://API.EXAMPLE.COM/my-folder/my-doc 

上面的URI很好。URI格式规范(RFC 3986)认为此URI与URI#1相同。

3)http://api.example.com/My-Folder/my-doc

该URI与URI 1和URI 2不同,这可能导致不必要的混淆。

规则6

文件扩展名不应包含在URI中。

在Web上,句点(。)字符通常用于分隔URI的文件名和扩展名部分。REST API不应在URI中包含人工文件扩展名,以指示消息的实体主体的格式。相反,它们应该依靠通过Content-Type标头传达的媒体类型来确定如何处理正文内容。

http://api.college.com/students/3248234/courses/2005/fall.json  
http://api.college.com/students/3248234/courses/2005/fall

文件扩展名不应用于指示格式首选项。

应该鼓励REST API客户端利用HTTP提供的格式选择机制,即Accept request标头。

为了实现简单的链接和调试,REST API可以通过查询参数支持媒体类型选择。

规则7

端点名称应为单数还是复数?

保持简单规则在此处适用。尽管内部语法专家会告诉您使用复数形式描述资源的单个实例是错误的,但务实的答案是保持URI格式的一致性,并始终使用复数形式。

不必处理不规则复数形式(person/people, goose/geese),使API消费者的生活更美好,是对API提供商实现(如最现代化的框架通过 controller 处理 /students/students/3248234 很容易)。

但是您如何处理关系?如果关系只能存在于另一个资源中,则RESTful原则将提供有用的指导。让我们来看一个例子。一个学生有许多课程。这些课程在逻辑上映射到 /students 端点,如下所示:

http://api.college.com/students/3248234/courses -检索ID为3248234的学生学习的所有课程的列表。
http://api.college.com/students/3248234/courses/physics -检索ID为3248234的学生的课程中的物理。

结论

设计REST API服务时,必须注意资源。这些由URI定义。

您正在构建的一个或多个服务中的每个资源将至少具有一个标识它的URI。最好是该URI有意义并充分描述资源。URI应该遵循可预测的层次结构,以增强易懂性,从而增强可用性:从统一性的意义上是可预测的,在数据​​具有结构关系的意义上则是分层的。

RESTful API是为消费者编写的。URI的名称和结构应向这些使用者传达含义。通过遵循上述规则,您将使用更快乐的客户端来创建更简洁的REST API。这不是REST规则或约束,但是它增强了API。

我还建议您看看这些准则

为您的客户而不是您的数据设计。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Bypass ngx_lua_waf SQL注入防御(多姿势)
0x00前言ngx\_lua\_waf是一款基于ngx\_lua的web应用防火墙,使用简单,高性能、轻量级。默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规则:select.(from|limit)(?:(union(.?)select))(?:from\Winformation_schema\W)这边
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
尾调苔藓
尾调苔藓
Lv1
帘卷西风,人比黄花瘦。
文章
2
粉丝
0
获赞
0