RESTAPI中的资源建模(timeseries数据和多标识符问题)

RESTAPI中的资源建模(timeseries数据和多标识符问题),api,rest,Api,Rest,我在为域中的资源建模以适应RESTAPI时遇到了一些困难。这个例子显然是精心设计和简化的,但它说明了我遇到的两个问题 我知道: 用户有宠物 宠物有多个名字——每个家庭成员都有一个名字 宠物有:出生日期、死亡日期和类型(狗、猫…) 我需要能够查询基于日期(实际上,日期,或日期范围是强制性的,当询问有关宠物)。例如:告诉我现在有什么宠物;告诉我奶奶说我们5年前到3年前养了什么宠物 我应该如何处理日期? a。在查询字符串中:/pets/dogs/d123?from=10102010&to=101020

我在为域中的资源建模以适应RESTAPI时遇到了一些困难。这个例子显然是精心设计和简化的,但它说明了我遇到的两个问题

我知道:

  • 用户有宠物
  • 宠物有多个名字——每个家庭成员都有一个名字
  • 宠物有:出生日期、死亡日期和类型(狗、猫…)
  • 我需要能够查询基于日期(实际上,日期,或日期范围是强制性的,当询问有关宠物)。例如:告诉我现在有什么宠物;告诉我奶奶说我们5年前到3年前养了什么宠物
  • 我应该如何处理日期?

    a。在查询字符串中:/pets/dogs/d123?from=10102010&to=10102015(但据我所知,查询字符串主要用于可选参数;需要日期/日期范围。如果查询字符串中没有任何内容,我想将当前日期作为默认日期。对此有何想法?)

    b。在小路的某个地方。在宠物之前?当我在一个日期和一系列日期之间切换时,这似乎有点奇怪。我真正的路已经有点长了

    我应该如何处理多个名称?

    在我看来,我必须指定谁使用我正在搜索的名称

    /宠物/狗/雷克斯->我想知道一只叫雷克斯的狗(是谁,我还是奶奶?)。但是奶奶该放在哪里呢

    我见过一些人说不要担心url,使用超媒体,但我的理解是(可能是我弄错了),你必须始终从根开始(这里/pets),并遵循响应中提供的链接。然后我就更加被卡住了(因为约会的可能性非常大)


    感谢您的帮助。谢谢

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

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

  • 在这种情况下,我想到的唯一一件事是颠倒这种关系,因此:

    /users/grandma/dogs/rex
    
    或:

  • 还可以做的是放弃REST规则,引入新的端点
    /dogs/filter
    ,它将接受
    POST
    请求,并在主体中包含filter。这样一来,描述整个查询以及发送查询都会容易得多。正如我提到的,这不是一种宁静的方法,但是在这种情况下它似乎是合理的。这样的过滤也可以用纯REST设计建模——过滤器也将成为一种资源


  • 超媒体似乎不是这种特殊情况下的发展方向——老实说,我不太喜欢超媒体设计。

    如果需要,可以使用查询字符串,这方面没有限制。路径包含层次结构部分,而查询包含非层次结构部分,但这也不是必需的

    通过查询,我建议您考虑参数以及响应中的内容。例如:

    我想知道那只叫雷克斯的狗(是谁,我还是奶奶?)

    参数是:
    rex
    grandman
    ,您需要在响应中使用
    dog
    s


    因此,超链接将类似于
    GET/pets/dogs/?owner=grandma&name=rex
    GET/pets/dogs/owner:grandma/name:rex/
    ,等等。。。如果您将一些RDF元数据附加到超链接和参数(例如,您可以使用vocab),则URI结构实际上并不重要。Ofc。这不是最好的选择,因为它不涉及多人给出的多个姓名,但如果您决定使用RDF,这是创建自己的vocab的一个良好开端。

    谢谢您的回答。我正在查看链接。第二点(颠倒关系)我没有想到,所以即使在这种情况下我可能不会这么做,也要记住这是一件有趣的事情。@AnaF,当然。让我知道你的想法。
    /dogs/rex/owners/grandma