我不熟悉REST,我注意到在一些RESTful服务中,它们使用不同的资源URI进行更新/获取/删除和创建。例如
- 使用post方法创建-使用/resources(注意复数),在某些地方使用/resource(单数)
- 更新-使用/resource/123 with put方法
- get-使用/resource/123和get方法
我对这个URI命名约定有点困惑。我们应该用复数还是单数来创造资源?决定这一点的标准是什么?
- 在这个主题之后,我在一篇文章中收集了一些著名的RESTAPI示例:inmensosofa.blogspot.com/2011/10/…。
- 我在阅读了以下所有答案后得出的结论是:总是使用单数,因为(a)它是一致的,(b)它直接映射到单数类和表名,(c)英语中有些复数名词是不规则的(不可预测的)。
- 关于单一表命名约定的链接,请参阅这个答案,还有一篇文章提到了这个问题,RESTAPI开发人员的困境-谢谢@sorter
对于我来说,最好有一个可以直接映射到代码的模式(易于自动化),主要是因为代码是两端都要做的事情。
1 2 3 4 5 6
| GET /orders <---> orders
POST /orders <---> orders.push(data)
GET /orders/1 <---> orders[1]
PUT /orders/1 <---> orders[1] = data
GET /orders/1/lines <---> orders[1].lines
POST /orders/1/lines <---> orders[1].lines.push(data) |
- 这样做的困难或容易是因为不尊重哈蒂奥斯。不管是复数还是单数还是其他什么形式。您应该尊重从服务器发送的URI,而不是在客户机上"构建"您的URI。然后您有0个映射要为您的代码做。
- @客户理查德仍然需要做地图绘制。在hateos中,它们必须映射到一个表示关系(rel)到uri构造的名称。然后,rel、方法(动词)和内容类型组成资源媒体。这并不排除需要一个好的URI设计。即使客户机可能优先使用rel名称,API的开发人员仍然需要一个良好的、人类可读的URI构造标准。
- @布里安雷德尔同意了。
- 在我看来,这是一个更好的答案。但我一直喜欢用单数代替复数。user.getList()、user.getByID、user.delete等。
- 我喜欢简单。该映射还具有使路由上的文档和测试非常容易编写的优点。
- 这对我来说是有意义的。然而,我们是数据库第一商店,这意味着我们从数据库模式生成代码和API实体。数据库标准倾向于提倡使用单一的表名,所以我们继续使用这个方法,但是仍然使用与这个答案相同的逻辑。
我也不认为这样做的意义所在,我认为这不是最佳的URI设计。作为一个RESTful服务的用户,我希望列表资源具有相同的名称,不管我是访问列表还是"列表"中的特定资源。无论是使用列表资源还是特定资源,都应该使用相同的标识符。
- 就我而言,这是最好的答案。我很欣赏API设计者喜欢说"获取资源123"的语言正确性,但是在编写API客户机和帮助文档时,这是额外的编码麻烦。(get/api/people与get/api/person/123?尤奇)不要把它想成"获取资源123",而要在头脑中把它说成"从与123匹配的资源集合中获取"。
- @如果API是由超媒体驱动的,那么Warrenrumak应该不会有任何麻烦。然而,在这种情况下,命名在实现过程中是次要的。
- 区分复数/单数资源不在于语言的正确性,而在于规模。/Employees/12将我读作ID为"12"的Employees资源的子集(它可以表示任何内容,例如保存了对最近解雇的员工的搜索查询)。如果您将上述内容读作ID为"12"的员工,您将如何表示该子集?唯一的选择是通过使URI的矿石更加复杂来区分包含对象的集合与对象本身(即单数与复数)。
- 我认为,选择/employees/12代表最近解雇的员工(或任何子集)的搜索查询是不好的设计。如果您想要表示任何类型的子集,我建议您以自己的权利将它们作为资源(使用适当的名称)引入。
- @Warrenrumak您考虑的是客户端构建URL。如果API正在实现适当的hateos,而客户机正以这种期望消耗它,那么无论是人还是人还是其他什么东西都不重要……URI由服务器决定。
- @Erik它不是一个好的URI,因为它没有正确地建立一个向量。你是对的…12代表什么?更好的方法是使用向量,即/employee/id/12。那么你可以做/雇员/被解雇?Top=12或/员工/雇佣?Top=12或/员工/小时?Top=12等,然后转向其他有意义的向量集(对于您的领域)。
- "这不重要,"理查德,但它-确实-因为各种原因。一个重要的问题是语言本身:对于您在其中指定RESTAPI的语言的非本机使用者来说,这是一个更具挑战性的问题。例如,日语没有名词的复数形式,许多名词都有相同的单词(罗马尼亚语中的"name"和"name"都是"nume")。像"bios"这样的缩写词的复数应该是什么?如果您的目标是通过一个URI进行"多"通信,那么您将经常遇到这样的困难故障。额外的复杂是最好避免的——它完全不会让你赢。
- @Warrenrumak你上面的评论说:"我很欣赏API设计者喜欢说"获取资源123"的语言正确性,但是在编写API客户端和帮助文档时,这是额外的编码麻烦。"你之前的观点是,虽然语言上更正确,但它是额外的编码麻烦等,但现在你说它更正确。语言困难-是什么?我认为,对于非母语人士来说,与使用的语言保持一致比背离语言来弥补非问题(编码麻烦)更容易理解。
- 你很难理解我的立场,理查德?好的,我会尽量简化它:它不是"更一致"、"更容易编程"、"更容易维护"或"更容易监控"一个程序,其中使用两个不同的词表示一种资源。考虑"人"与"人":无论您是系统管理员扫描日志文件,还是中国开发人员英语能力差,还是任何开发人员首次学习您的API,这都是一个障碍,它会增加学习时间,同时对应用程序的运行没有任何好处。
- 这与客户的理解能力无关。它是关于用不同的URL来处理不同的事情。并且能够响应所有HTTP方法而不发生冲突。您可以拥有一个项目集合资源和一个代表项目本身的资源。我所关心的是,collection s资源可以是example.org/166316e2-e1和该collection example.org/20d68348-ccc-001c4200de中的一个特定项。客户机不应该构造URL(这显然不具有伸缩性,它不是RESTful,这就是链接关系类型的用途)。
- 如果您不认为任意的URL是漂亮的,那么可以自由地用复数名称标识集合资源,用单数名称标识单个项目。如果你不喜欢英文网址,而且你的自然语言不支持这样的单复数表示法,我想所有的语言都能让你以某种方式区分‘/BLA/2321’和‘/BLA/61’的集合。这两种不同的资源在发送get/put/delete/post/patch和其他资源时都代表完全不同的结果。
使用/resources的前提是它代表"所有"资源。如果您执行GET /resources,您可能会返回整个集合。通过过账到/resources,您将添加到集合中。
但是,单个资源在/resource处可用。如果您执行GET /resource,可能会出错,因为此请求没有任何意义,而/resource/123则完全有意义。
使用/resource而不是/resources,与使用文件系统和文件集合时的情况类似,其中/resource是包含单个123和456文件的"目录"。
无论是对是错,都要选择你最喜欢的。
- 回答得很好!但是Windows中的"默认"目录有复数名称。像"程序文件"、"用户"、"文档"、"视频"等,我也经常在网站URL中遇到复数名称。
- 事实上,大多数人和原料药都是以复数形式存在的。id指定一个资源车/id
- "无论是对是错,都要按你最喜欢的去做。"啊,我经常听到的那句名言,听了别人的话就恶心、厌烦了。公约很重要,应该在社区中建设性地讨论,这就是更好的解决方案和良好实践的地方。当您在uris中同时使用复数和单数形式的资源名时,会使代码和api复杂化,因为用户和api背后的代码必须在路由和逻辑中考虑到这一点,以区分单复数和复数,而如果您一直坚持使用复数形式,则没有任何专业知识。布雷姆。
- @这完全不是真的。URI模板应该是完全不透明的。这里引用了罗伊·菲尔丁的论文"服务器或客户机软件在任何时候都不需要知道或理解URI的含义"。不需要在客户端和服务器上构造或解构URI。即使使用像http://example.org/{GUID}这样的guid,一个好的API也应该同样适用于所有的URL。这是因为URL应该作为链接进行通信。客户端不关心服务器如何分配标识符,服务器端路由可以通过使用完整的URL作为ID来减轻。
- @你完全正确,客户不在乎。作为软件开发人员,我们应该关心——为此,我同意WTF的评论,即关于约定的建设性辩论是有价值的。
- @你说建设性辩论很有价值是对的。但在这种情况下,常见的参数(如wtf所说的在uris中对资源名同时使用复数和单数)会使代码复杂化,这是不合适的。客户端不应该构造标识符,因此它不是一个好的参数
- 我会建议你坚持他们中的任何一个。单数复数是讲英语的人很容易理解的东西,但是机器理解它并不容易。存货是单数还是复数?为什么用户的复数是user+s,而婴儿的复数是baby?这使得它非常不一致。对于机器来说。
- 所以,有人能不能只回答一个字,让它被接受,这样我就不必(再)读这些了。
- 通常,URL末尾的斜线"/"表示容器。即容器/资源/基本上有子资源/资源/12和/资源/23。
- 如何创建资源搜索的URL../资源/搜索?查询参数
- 我相信你提到一个项目时应该用复数。也许两者都被认为是休息的最佳实践,但复数更常见。get/resources(所有资源的列表)get/resources/id(单个资源)
- 我强烈建议阅读其他答案…
- 我不同意为一个GET和GET列表提供不同的URL。这意味着用户需要根据自己的方法管理额外的URL。保持原样,以便于使用。
- 此页面URL为stackoverflow.com/questions/6845772,即复数:)
复数的
- 简单-所有URL以相同的前缀开头
- logical-orders/获取订单的索引列表。
- 标准-最广泛采用的标准,其次是绝大多数公共和私有API。
例如:
GET /resources—返回资源项列表
POST /resources—创建一个或多个资源项
PUT /resources-更新一个或多个资源项
PATCH /resources—部分更新一个或多个资源项
DELETE /resources-删除所有资源项
对于单个资源项:
GET /resources/:id—返回基于:id参数的特定资源项
POST /resources/:id—创建一个具有指定ID的资源项(需要验证)
PUT /resources/:id—更新特定资源项
PATCH /resources/:id—部分更新特定资源项
DELETE /resources/:id—删除特定的资源项
对于主张单数的人来说,可以这样想:你会向某人索要一个order,并期望得到一件事,还是一张清单?那么,当您键入/order时,为什么您希望服务返回一个列表?
- 单数:如果系统的一部分仅为一个对象(0-1,是否存在),例如用户/1/avatar,则可以使用单数形式标记此单个对象(例如avatar)-此处更详细的示例:stackoverflow.com/a/38296217/860099。顺便说一句-非常好的回答:)
- 如何映射到类和表名,应该是单数?(见其他答案)
- @willsheppard-类名最好是单数形式,表名最好是复数形式。例如,对于处理引用一个顺序的对象的奇异实例的类,Order是一个好名称。OrderList是处理多个Order实例的类的名称。Orders Table是许多订单的数据库表的好名称。
- 我想得到订单,但我只想要/1
- imho order和table一样好。
单数
方便事物可以有不规则的复数名称。有时他们没有。但是单数的名字总是存在的。
例如,客户服装而不是客户服装
考虑这个相关的资源。
这个/order/12/orderdetail/12比/orders/12/orderdetails/4更易读,更合乎逻辑。
数据库表
资源表示类似数据库表的实体。它应该有一个逻辑上的单数名称。这是表名的答案。
类映射
类总是单一的。ORM工具生成与类名同名的表。随着越来越多的工具被使用,单一的名称正在成为一种标准。
阅读有关RESTAPI开发人员困境的更多信息
- 单数的名字总是存在于cx1〔12〕中。
- @gertarnold这个单词clothe是一个动词。RESTAPI通常在谈论资源时坚持使用名词,在描述动作时使用动词。单数形式是clout,但很古老,可能更适合用garment代替。
尽管最普遍的做法是使用复数形式的RESTful API,例如/api/resources/123,但有一种特殊情况是,我发现使用单数形式的名称比复数形式的名称更合适/更具表现力。这是一对一的关系。特别是如果目标项是值对象(在域驱动的设计范式中)。
假设每个资源都有一对一的accessLog,它可以被建模为一个值对象,即不是一个实体,因此没有ID。它可以表示为/api/resources/123/accessLog。通常的动词(post、put、delete、get)会恰当地表达意图,而且事实上这种关系确实是一对一的。
- 很好的尝试。但最好是"accesslogentries"。-)
- @汤拉塞尔为什么?这一点的含义很重要。我理解为什么你会使用复数,即使你是通过一个标识符访问一个资源,但对于多对一或一对一,这是相当误导。考虑一个管理多地点公司员工的API。每个员工在一个地点工作。GET /users/123/location应该获取用户工作的位置。作为消费者,GET /users/123/locations是否真的具有误导性?
- @我明白你的意思。由于accessLog被建模为一个属性或值,而不是一个实体,所以它应该是单数的。如果你习惯于过度工程,那么一个日志条目就是一个实体,你会得到/api/accessLogEntries?resource=123。
- 同意,不过,我认为它确实打破了所有事物的多元化惯例。这是个棘手的问题。对我来说,这比API更重要的是,IE文档应该补充已经直接实现的功能。
- 我更像是一个程序员而不是系统或数据库人员,所以我喜欢一个讲述故事而不是遵循惯例的API。然而,自动化文档的含义是真实的。
- 这对我来说是有意义的。如果考虑到文件系统/网站的类比,复数表示文件夹名称,而单数表示文件。Put应用于api/resources/123/accessLog端点的创建和更新:因为在创建后不需要ID或新的URL来表示accesslog,所以在那里发布没有意义。
为什么不遵循数据库表名的流行趋势,在这种情况下通常接受单一形式?去过那里,做过——让我们重用。
表命名困境:单数与复数名称
- Das Auto比Die Auto要好得多。此外,英语复数约定也不一致。
- 资源名称空间是语义问题,而不是实现问题。所以,使用DB表类比,并不是很幸运。同样,当使用DB-S时,您只操作表,当然您可以影响内容(行),但是在REST中,没有约束可以直接操作单个资源。
- 我认为这是一个很好的类比,但比决定是单数还是复数更重要的是要与你选择的任何一个保持一致。您将不会插入到用户中,然后从用户中选择。同样的规则也适用于REST资源-不要根据所做的重命名它们。
- 它不仅仅是表名,它还可以与OO中的类名相比较(我的类将被称为客户而不是客户)。
- 在这种情况下,语义太重要了,不能简单地接受"已定义"的趋势。
我很惊讶地看到这么多人会跳上复数名词的潮流。在执行单数到复数转换时,您是否注意不规则复数名词?你喜欢疼痛吗?
见http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm网站
有许多不规则复数形式,但这些是最常见的:
构成复数示例的名词类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| Ends with -fe Change f to v then Add -s
knife knives
life lives
wife wives
Ends with -f Change f to v then Add -es
half halves
wolf wolves
loaf loaves
Ends with -o Add -es
potato potatoes
tomato tomatoes
volcano volcanoes
Ends with -us Change -us to -i
cactus cacti
nucleus nuclei
focus foci
Ends with -is Change -is to -es
analysis analyses
crisis crises
thesis theses
Ends with -on Change -on to -a
phenomenon phenomena
criterion criteria
ALL KINDS Change the vowel or Change the word or Add a different ending
man men
foot feet
child children
person people
tooth teeth
mouse mice
Unchanging Singular and plural are the same
sheep deer fish (sometimes) |
- 我不理解这里的担心。我们不应该通过编程将单数改为复数。以上大多数复数形式是众所周知的,不应该被关注。如果有人英语知识不好,他会把你变量的任何部分拼写错误。此外,按照逻辑,您是否还建议使用单数形式来引用源代码中的集合?
从API使用者的角度来看,端点应该是可预测的,因此
理想的。。。
GET /resources应返回资源列表。
GET /resource应返回400级状态代码。
GET /resources/id/{resourceId}应该用一个资源返回一个集合。
GET /resource/id/{resourceId}应该返回一个资源对象。
POST /resources应该批量创建资源。
POST /resource应该创建一个资源。
PUT /resource应该更新一个资源对象。
PATCH /resource应该通过只发布更改的属性来更新资源。
PATCH /resources应该批量更新只发布更改属性的资源。
DELETE /resources应删除所有资源;开玩笑:400状态码
埃多克斯1〔23〕
这种方法是最灵活和功能丰富的,但也是最耗时的开发方法。所以,如果你赶时间(软件开发总是这样),只需说出你的端点resource或复数形式resources。我更喜欢单数形式,因为它可以让你选择以编程方式反省和评估,因为并非所有复数形式都以"s"结尾。
尽管如此,无论出于什么原因,最常用的实践开发人员选择的是使用复数形式。这是我最终选择的路径,如果你看看像github和twitter这样的流行API,这就是它们所做的。
决定的一些标准可能是:
我的时间限制是什么?
我将允许我的消费者做什么操作?
请求和结果有效负载是什么样子的?
我想在代码中使用反射和解析URI吗?
所以这取决于你。不管你做什么都要始终如一。
- 似乎选择复数形式是因为开发人员似乎假定所有资源都是某些集合的固有部分。然而,"接受的约定"似乎表明POST /users应该创建一个用户,并将其添加到集合中。我不同意。POST /users应该创建一个用户列表(即使是1的列表),其中POST /user应该只创建一个用户。我看不出为什么复数和单数资源端点不能共存。他们描述了不同的行为,不应该让任何人对他们的功能感到惊讶。
- 路径中没有指定资源ID的约定吗?如果是这样,它似乎被广泛忽视了。例如,POST users/将创建一个新用户。
- @TomRussell通常由服务器创建ID,所以您还不知道要发布到哪个ID。
- @Tomrussell,当客户端在创建新资源时确定(一种)ID时,使用PUT /users/而不是POST更为常见。POST的解释是"将此添加到集合中,并确定ID作为集合的一部分"。PUT的解释是"使用此ID更新(或添加)此资源"。有关此原则的更长解释,请参阅restcookbook.com/http%20methods/put-vs-post。
为了简单和一致,我更喜欢使用单数形式。
例如,考虑以下URL:
/客户/1
我将把客户视为客户集合,但为了简单起见,集合部分被移除。
另一个例子:
/设备/1
在这种情况下,设备不是正确的复数形式。因此,将其视为设备集合,并为了简单起见删除集合,使其与客户案例一致。
- Post/Customer听起来将取代唯一的客户。这是我使用单一资源名称的最大遗憾。
- @Andrew-T-Finnell难道不是POST /customer应该做的事情就是插入一个客户吗?
我的2分:那些花费时间从复数变为单数或viceversa的方法是在浪费CPU周期。我可能是个老派,但在我的时代,一切都是一样的。我如何查找与人有关的方法?任何定期的表达都不能覆盖没有不良副作用的人和人。
英语的复数形式可能非常武断,它们不必要地妨碍了代码。坚持一个命名约定。计算机语言应该是关于数学的清晰,而不是模仿自然语言。
- 这处理了试图"自动生成/管理"端点的代码(有许多自以为是的库假定多个/奇点并尝试映射);但是,这适用于明确选择的端点名称,而不仅仅是选择正确的词(不管它是如何复数的)。
对于命名约定,通常说"只选一个并坚持它"是安全的,这是有意义的。
然而,在必须向许多人解释REST之后,将端点表示为文件系统上的路径是最具表现力的方法。它是无状态的(文件要么存在,要么不存在),分层的,简单的,熟悉的-您已经知道如何访问静态文件,无论是本地的还是通过HTTP。
在这种情况下,语言规则只能让你达到以下目的:
A directory can contain multiple files and/or sub-directories, and therefore its name should be in plural form.
号
我喜欢这样。但是,另一方面,它是您的目录,如果您需要的话,您可以将它命名为"a-resource-or-multiple-resource s"。这并不重要。
重要的是,如果将名为"123"的文件放在名为"resources"的目录下(导致/resourceS/123的结果),那么就不能期望通过/resource/123访问该文件。
不要试图让它变得比它必须的更聪明-从复数变为单数取决于你目前正在访问的资源的数量,这对一些人来说可能是美学上的愉悦,但它是无效的,在一个等级系统中也没有意义。
注:从技术上讲,你可以做"符号链接",这样/resourceS/123也可以通过/resource/123访问,但前者仍然存在!
(P)我知道大多数人是在决定使用复数还是单数之间。The issue that has not been addressed here is that the client will need to know which one you are using,and they are always like to make a mistake.这是我的建议从哪里来。(p)(P)怎么样的船?And by that,I mean use unique for your whole api and then create routes to forward requests made in the plural form to the individual form.For example:(p)字母名称(P)You get the picture.没有人是错误的,最小的努力,和客户将永远得到它的权利。(p)
- 你的储物柜可以储存所有东西两次。不,谢谢。
- 如果您正在执行302重定向,并且缓存将所有内容存储两次,则说明您的缓存设置错误。缓存不应该存储302个重定向。
- 如果您的客户总是使用/resources,并且总是被重定向到/resource,那么您就错了。如果其他人使用了您的API,他们可以直接使用正确的URL,也可以被重定向(这是有效的,但是错误的),并且是您以错误的方式打开的。
- 不知道你说的"错"是什么意思——这是非常主观的。这并不是真的错,因为它确实有效。
- 这会增加维护成本、理解成本和所需代码的数量。
对所有方法使用复数至少在一个方面更实际:如果您正在使用Postman(或类似工具)开发和测试资源API,则在从GET切换到POST等时不需要编辑URI。
- 对我来说,这不是一个论点,因为邮递员提供了收集,所以您可以将所有资源保存为不同的收集项目,并单独测试它们。您所要做的就是从集合中选择资源,而不必每次都编辑参数/方法等。
这两种表示都很有用。为了方便起见,我用了很长一段时间,拐点可能很困难。我在开发严格单一的RESTAPI方面的经验是,使用端点的开发人员对结果的形状缺乏确定性。我现在更喜欢使用最能描述响应形状的术语。
如果您的所有资源都是顶级的,那么您就可以使用单一的表示来摆脱它。避免拐点是一个巨大的胜利。
如果您正在进行某种深度链接来表示对关系的查询,那么使用更严格的约定可以帮助开发人员编写API。
我的约定是,URI中的每个深度级别都在描述与父资源的交互,而完整的URI应该隐式地描述正在检索的内容。
假设我们有以下模型。
1 2 3 4 5 6 7 8 9 10 11
| interface User {
<string>id;
<Friend[]>friends;
<Manager>user;
}
interface Friend {
<string>id;
<User>user;
...<<friendship specific props>>
} |
号
如果我需要提供一个允许客户机获取特定用户的特定朋友的经理的资源,它可能看起来像:
江户十一〔四〕号
以下是更多示例:
- GET /users—列出全局用户集合中的用户资源
- POST /users—在"全球用户"集合中创建新用户
- GET /users/{id}—从全局用户集合中检索特定用户
- GET /users/{id}/manager—获取特定用户的经理
- GET /users/{id}/friends—获取用户的朋友列表
- GET /users/{id}/friends/{friendId}—获取用户的特定朋友
- LINK /users/{id}/friends-向此用户添加朋友关联
- UNLINK /users/{id}/friends-从此用户中删除朋友关联
请注意,每个级别如何映射到可以对其执行操作的父级。对同一对象使用不同的父对象是违反直觉的。在GET /resource/123检索资源时,没有迹象表明应在POST /resources上创建新资源。
(P)How about:(p)(P)字母名称2(p)(P)EDOCX1 2(英文)意思是"It's a folder contains some called"resource",it's a"resource"folder.(p)(P)and also I think the Naming Convention of Database Tables is the same,for example,a table called'user'is a"user table",it contains some called"user".(p)
对我来说,复数形式操纵集合,而单数形式操纵集合内的项。
集合允许方法get/post/delete
项允许方法获取/放置/删除
例如
发布/学生将在学校添加新学生。
删除打开/学生将删除学校中的所有学生。
/student/123上的delete将从学校中删除student 123。
可能感觉不重要,但有些工程师有时会忘记ID。如果路由始终是复数并执行删除操作,则可能会意外地擦除数据。而在单数上缺少ID将返回一个404路由找不到。
为了进一步扩展这个示例,如果API应该公开多个学校,那么
删除on/school/abc/students将删除学校中的所有学生abc。
选择正确的词有时本身就是一个挑战,但我喜欢为收藏保持多元化。例如,cart_items或cart/items感觉是对的。与删除cart相反,删除购物车对象本身而不是购物车中的项目;)。
- 这难道不应该被拆分为/cart和/cart/项吗?然后您可以处理整个购物车(例如删除)或单个项目?
- @罗伯特格兰特会不会是/carts/items/123?(例如,为什么"cart"而不是"carts"规则是"始终复数"?
- 我认为,如果签入了生产代码,那么可以删除每个人的购物车项目,那么存在比命名约定更大的问题。他们可能记得的"S"比"ID"小得多。
(P)I prefer to use both plural(EDOCX1)and individual(EDOCX1)and individual(EDOCX1)because I think that it more clearly separates the logic between working on the collection of resources and working on a single resource.(p)(P)作为一个重要的方面——这一点的影响,它也可以帮助防止一些人利用投资政策评审错误。For example,consider the case where a user wrongly tries to get a resource by specifying the id as a parameter like this:(p)字母名称(P)In this case,where we use the plural version,the server will most likely ignore the id parameter and return the list of all resources.如果用户不关心,他会认为呼吁是成功的,并在名单中使用第一种资源。(p)(P)On the other hand,when using the unique form:(p)字母名称(P)The server will most likely return an error because the id is not specified in the right way,and the user will have to realize that some thing is wrong.(p)
- 你为什么在这里混合成语?在第一段中使用适当的URI表示法,然后切换到查询参数?使用查询参数获取ID为123的资源在这里完全是不基本的。
- 那显然是个错误。我已经更新了我的答案。谢谢你注意到了。
- 再次被否决后,我看了看自己写的东西,发现原来的帖子是正确的。我的观点是,如果用户做了错误的事情,那么使用复数+单数实际上会给出一个更好的错误信息,即只使用复数。
- 我仍然觉得这让手头上的问题很困惑。使用复数的意思是它是一个集合。最后的数字是集合的索引。如果你自己获得/资源怎么办?同时使用复数和单数非常令人困惑。saying/resources/123说:在resources bucket中获取我的resource 123。