REST API中的资源建模(时间序列数据和多个标识符的问题)

Ana*_*a F 5 api rest

我在为域中的资源建模以适应REST API时遇到了一些麻烦.这个例子显然是做作和简化的,但它说明了我陷入困境的两点.

我知道:

  1. 用户有宠物
  2. 宠物有多个名字 - 每个家庭成员一个
  3. 宠物有:出生日期,死亡日期和类型(狗,猫......)
  4. 我需要能够根据日期进行查询(实际上,在询问宠物时,日期或日期范围是强制性的).例如:告诉我现在有什么宠物; 告诉我奶奶说5年前我们有什么宠物,直到3年前.

我该如何处理日期?

一个.在查询字符串中:/ pets/dogs/d123?from = 10102010&to = 10102015(但据我了解,查询字符串主要用于可选参数;日期/日期范围是必需的.我在考虑将当前日期作为默认值,如果查询字符串中没有任何内容.有任何想法?)

湾 在路径的某个地方.之前/宠物?当我在日期和日期范围之间切换时,这似乎有点奇怪.而我真正的道路已经很长了

我该如何处理多个名字?

我看到它的方式,我必须指定谁使用我正在搜索的名称.

/ pets/dogs/rex - >我想知道叫做rex的狗(由谁,我还是奶奶?).但在哪里放奶奶?

我看到有些人说不要担心网址,并使用超媒体但我理解的方式(而且我可能错了)是你必须始终从根(这里/宠物)开始并遵循响应中提供的链接.然后我就更加困难了(因为这个日期确实很长很多).

任何帮助表示赞赏.谢谢

Opa*_*pal 1

在这种情况下可能有用的是一种资源查询语言。它不知道您使用的技术堆栈,但可以在此处找到 JavaScript 示例。

  1. 绝对不要在路径中放置任何日期。这被认为是一种不好的风格,用户可能会感到困惑,因为他们中的大多数人可能不习惯这种奇怪的设计,并且根本不知道如何使用 API。通过查询字符串传递日期是完全没问题的。您可以引入默认状态 - 这不是一个坏主意 - 但您需要在响应中描述该状态(例如包括日期)。400 Bad Request当请求中缺少日期范围时,您还可以返回状态代码。就我个人而言,我会通过查询字符串获取默认状态和日期。

  2. 在这种情况下,我想到的唯一的事情就是颠倒这种关系,所以它是:

    /users/grandma/dogs/rex
    
    Run Code Online (Sandbox Code Playgroud)

    或者:

    /dogs/rex/owners/grandma
    
    Run Code Online (Sandbox Code Playgroud)
  3. 还可以做的是放弃 REST 规则并引入新的端点,/dogs/filter该端点将接受POST主体中带有过滤器的请求。这样,描述整个查询以及发送它就会容易得多。正如我所提到的,这不是 RESTful 方法,但在这种情况下似乎是合理的。这种过滤也可以使用纯 REST 设计进行建模 - 过滤器也将成为一种资源。

超媒体似乎不是这种特殊情况下的出路——说实话,我不太喜欢超媒体设计。