首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RESTful服务中特定场景的最佳实践

RESTful服务中特定场景的最佳实践
EN

Stack Overflow用户
提问于 2011-07-05 18:41:00
回答 3查看 401关注 0票数 7

我有两个简短的问题,我只想了解社会人士的意见-

如果我有一个可以用ID或日期(20110705)访问的实体,那么用于访问实体的url约定的最佳实践是什么?

代码语言:javascript
复制
- 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}`\*?

  1. 在WCF中,我也可以做/myEntities/?date={date}/myEntities/?id={id},这是一个好的Rest实践吗?换句话说,就最佳实践而言,使用?date={date}而不是date/{date}/是否可以接受,就像它只是个人的偏好一样?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-05 18:46:49

我觉得这很大程度上取决于偏好和风格。

话虽如此,我个人更倾向于:

/myEntities/date/{date}/myEntities/{id}

不需要显式地使用ID选项;它是假定的。

关于#2,我个人不喜欢这样的语法:/myEntities/?date={date} ,如果它是作为URI模板在WCF中实现的--因为如果您有多个参数,那么假设参数的顺序是可以挤来挤去的--但是它们不能使用URI模板。但是,作为标准的查询字符串参数,这是完全可以接受的,而且在各地都是如此--谷歌、雅虎、亚马逊和其他公司都使用这种风格。如果有的话,这正是“查询字符串”的含义-查询的参数.这正是您在通过__检索实体时所做的事情。

(但我和你一样好奇别人会说什么)。

票数 8
EN

Stack Overflow用户

发布于 2011-07-06 00:15:39

/myEntities/date/{date}应该根据您的应用程序使用301或307重定向到/myEntities/{id}。这减少了由于多个缓存副本导致数据不同步的可能性,并向客户表明/myEntities/date/*只是一个备用索引,而不是一组独立的资源(因为HTTP的分层性质,如果您没有重定向,他们可能会正确地预期)。

票数 6
EN

Stack Overflow用户

发布于 2015-02-19 19:37:38

资源有一个标识URL (如果愿意的话是self url )。这种情况绝不能改变。这也意味着,如果您在某一点上更改该id,则该id不是您在url中使用的。如果你冒着回收身份证的风险,那么你绝对不应该使用那个id。

这也意味着,您将永远不会有两个urls将唯一地标识相同的资源。

这并不意味着您不能从两个不同的urls访问相同的资源。你想这么做有很多原因。有几件事你需要确定。

对于任何使用API的人来说,您应该非常容易理解正在发生的事情。你列出的选项不会那么做。

它基本上可以归结为建模,并确保您的内部模型不会流入公共api。您可能有一个重载的方法,它可以将id或日期作为输入参数,但这并不意味着您应该公开该重载。

因此,问问自己,这两种情况中的每一种情况都解决了什么问题,然后就会变得很明显。

我也不喜欢史蒂夫的建议。消费者如何知道你可以写‘日期’而不是一个id,然后突然访问日期?这不是直觉。

因此,扪心自问,是否能够将日期作为url的一部分使用是最重要的,还是将其添加为集合中的querystring筛选器更好。这样,您实际上可以公开一个日期筛选器,这可能更有价值,也更直观。

另一种办法是考虑一些大致如下的内容:

/years,它可能公开年份对象的列表。

代码语言:javascript
复制
{
  "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是一个月对象的例子。

代码语言:javascript
复制
{
  "month": 1,
  "name": "January",
  "entities": "https://api.myapp.com/years/2015/months/1/entities",
  "self": "https://api.myapp.com/years/2015/months/1"
}

“实体”属性具有指向按日期筛选的实体集合的链接。

但这又取决于你的具体问题。只需记住要使界面直观,不要让内部建模流进公共api。但这根本不是一件容易的事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6587317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档