我有两个简短的问题,我只想了解社会人士的意见-
如果我有一个可以用ID或日期(20110705)访问的实体,那么用于访问实体的url约定的最佳实践是什么?
- GET : `/myEntities/{date}` and `/myEntities/{id}` ? (which the service will parse the {object} to check if it is a date or an id.
- GET : `/myEntities/date/{date}` and `/myEntities/id/{id}`\*?
/myEntities/?date={date}和/myEntities/?id={id},这是一个好的Rest实践吗?换句话说,就最佳实践而言,使用?date={date}而不是date/{date}/是否可以接受,就像它只是个人的偏好一样?提前谢谢。
发布于 2011-07-05 18:46:49
我觉得这很大程度上取决于偏好和风格。
话虽如此,我个人更倾向于:
/myEntities/date/{date}和/myEntities/{id}
不需要显式地使用ID选项;它是假定的。
关于#2,我个人不喜欢这样的语法:/myEntities/?date={date} ,如果它是作为URI模板在WCF中实现的--因为如果您有多个参数,那么假设参数的顺序是可以挤来挤去的--但是它们不能使用URI模板。但是,作为标准的查询字符串参数,这是完全可以接受的,而且在各地都是如此--谷歌、雅虎、亚马逊和其他公司都使用这种风格。如果有的话,这正是“查询字符串”的含义-查询的参数.这正是您在通过__检索实体时所做的事情。
(但我和你一样好奇别人会说什么)。
发布于 2011-07-06 00:15:39
/myEntities/date/{date}应该根据您的应用程序使用301或307重定向到/myEntities/{id}。这减少了由于多个缓存副本导致数据不同步的可能性,并向客户表明/myEntities/date/*只是一个备用索引,而不是一组独立的资源(因为HTTP的分层性质,如果您没有重定向,他们可能会正确地预期)。
发布于 2015-02-19 19:37:38
资源有一个标识URL (如果愿意的话是self url )。这种情况绝不能改变。这也意味着,如果您在某一点上更改该id,则该id不是您在url中使用的。如果你冒着回收身份证的风险,那么你绝对不应该使用那个id。
这也意味着,您将永远不会有两个urls将唯一地标识相同的资源。
这并不意味着您不能从两个不同的urls访问相同的资源。你想这么做有很多原因。有几件事你需要确定。
对于任何使用API的人来说,您应该非常容易理解正在发生的事情。你列出的选项不会那么做。
它基本上可以归结为建模,并确保您的内部模型不会流入公共api。您可能有一个重载的方法,它可以将id或日期作为输入参数,但这并不意味着您应该公开该重载。
因此,问问自己,这两种情况中的每一种情况都解决了什么问题,然后就会变得很明显。
我也不喜欢史蒂夫的建议。消费者如何知道你可以写‘日期’而不是一个id,然后突然访问日期?这不是直觉。
因此,扪心自问,是否能够将日期作为url的一部分使用是最重要的,还是将其添加为集合中的querystring筛选器更好。这样,您实际上可以公开一个日期筛选器,这可能更有价值,也更直观。
另一种办法是考虑一些大致如下的内容:
/years,它可能公开年份对象的列表。
{
"year": 2015,
"entities": "https://api.myapp.com/years/2015/entities",
"months": [
{
"month": 1,
"name": "January",
"entities": "https://api.myapp.com/years/2015/months/1/entities",
"self": "https://api.myapp.com/years/2015/months/1"
},
... array of month objects
],
"self": "https://api.myapp.com/years/2015"
}/years/2015/months/1是一个月对象的例子。
{
"month": 1,
"name": "January",
"entities": "https://api.myapp.com/years/2015/months/1/entities",
"self": "https://api.myapp.com/years/2015/months/1"
}“实体”属性具有指向按日期筛选的实体集合的链接。
但这又取决于你的具体问题。只需记住要使界面直观,不要让内部建模流进公共api。但这根本不是一件容易的事。
https://stackoverflow.com/questions/6587317
复制相似问题