我正在为我们的后端创作私人API。
我有具有关联的收藏。
每个集合都可以要求,分页,您也可以要求协会并为此关联分页。

我们不确定要使用哪种URL设计...我们正在考虑:

  • /Users.json?per_page=10&asociation=parts,auditions&parts_per_page=5&auditions_per_page=5

  • /USERS.JSON?PER_PAGE=10&Association [= PARTS&association [] = auditions&parts_per_page=5&auditions_per_page=10

  • /USERS.JSON?PER_PAGE=10&association [auditions] = True&association [parts] per_page] = 5

你怎么看 ?您会choss什么?为什么 ?其中之一看起来不像有效的URL方案吗?

谢谢 !

有帮助吗?

解决方案

我的答案: /users.json. 。 HTTP用于大颗粒超媒体转移;缓存是其中的重要组成部分,上面给出的URI方案都不非常适合缓存。

例如,Squid是一个流行的HTTP缓存,默认情况下,它不会缓存任何具有Querystring的URL。此外,许多客户端甚至服务器和中介机构都以未定义的顺序生成和消耗查询字符串参数。那就是,“?a = 3&b = 5”可以任意重写为“?b = 5&a = 3”。但是,对于HTTP缓存,订单很重要,即使它们具有相同的内容,也将分别缓存。当您添加参数时,此问题呈指数增加。

您应该设计自己的资源(及其表示形式),以利用两种相反但互补的技术来缓存:

  1. 将碎片和部分表示结合到更大的统一表示中,并
  2. 将大型的统一表示形式分开为沿缓存边界的较小表示形式(倾向于交易边界),但通过超链接相关。

在您的情况下,步骤1意味着将关联和零件组合到“用户”表示中,而无需任何选项以配置哪些和多少。这将使您能够积极地缓存单个响应表示形式,而不会因所有查询选项而与响应的组合爆炸过重载。

步骤2意味着分开 /users.json 进入单独的“用户”实体,每个实体都有“关联”资源和“零件”资源。所以 /users/{id}/users/{id}/associations/users/{id}/parts. 。然后,“/用户”资源将超链接的数组返回到单个的“/users/{id}”资源,每个资源”和每个“/users/{id}”表示超链接到其关联和零件(该零件更可行 - 可延展 - - 它可能更适合您的应用程序,将关联和零件直接嵌入用户资源)。这将使您能够积极地缓存每个“需求”资源的响应,而无需缓存整个数据库。

然后,您的用户将尖叫“但这是网络流量的10倍!”您冷静地回答说:“不,这是网络流量的1/10,因为在10个中,需要9次,请求的资源已经坐在您的客户端(浏览器)缓存中(当它们不是时,它是1/10服务器的计算资源自坐在服务器端缓存中,并且当它们不存在时,我们避免使用服务器上的智能缓存盖章)。”

当然,如果 /users 资源是每天有一百万新访问者的目标,那么您的优化路径可能会有所不同。但这似乎不是基于您的示例URI计划。

其他提示

我会去第一个。我不喜欢在URL上看到[]符号,恕我直言,客户更难使用和理解。一些更改作为建议。

1)由于协会似乎是一个数组,因此对关联进行更改(复数,如果我是对的,那是一个数组)

2)您还可以尝试放置默认的per_page和一个可选的,甚至汇总,例如per_page_parts_auditions,而不是同时使用per_page_parts和per_page_auditions。如果您的API被设计为公开,我不会做到这一点,因为它更易于使用,但很难理解,但是当您发布的是私人的情况下。.应该是避免复制的好方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top