【问题标题】:RESTful url to GET resource by different fields通过不同字段获取资源的 RESTful url
【发布时间】:2012-06-21 16:46:24
【问题描述】:

一个简单的问题,我找不到答案..

如果我有一个 REST Web 服务,并且我的设计没有使用 url 参数,我如何指定两个不同的键来返回相同的资源?

示例 我想要(并且已经实现)

/Person/{ID}

按预期返回一个人。

现在我也想要

/Person/{Name}

返回一个人的名字。

这是正确的 RESTful 格式吗?或者是这样的:

/Person/Name/{Name}

【问题讨论】:

    标签: rest


    【解决方案1】:

    您应该只使用一个 URI 来引用单个资源。拥有多个 URI 只会造成混乱。在您的示例中,由于两个人的名字相同,会引起混淆。那么他们指的是哪个人员资源?

    也就是说,您可以让多个 URI 引用一个资源,但对于“真实”URI 以外的任何内容,您都应该使用状态代码 301 - Moved Permanently 将客户端重定向到正确的位置。

    就个人而言,我永远不会实施多 ID 方案或重定向来支持它。选择一个单一的识别方案并坚持下去。您的 API 的用户会感谢您。

    您真正需要构建的是查询 API,因此请关注如何实现类似 /personFinder 资源的东西,它可以将名称作为参数并在响应中返回可能多个匹配的 /person/{ID} URI。

    【讨论】:

      【解决方案2】:

      我想从技术上讲,你可以让两个 URI 指向同一个资源(也许其中一个作为规范资源),但我认为从实现的角度来看你不希望这样做。如果 ID 和名称重叠怎么办?

      这确实是一个使用查询参数的好地方,但如果你坚持不这样做,也许你可以这样做

      person/{ID} 
      

      personByName/{Name}
      

      【讨论】:

      • 我认为会有一种标准的方式来做到这一点,这对我来说似乎很常见。感谢您的意见。
      • 我认为最标准的做法是你已经排除的 - 查询参数。顺便说一句,您的 URL 的内容并不能使其成为 RESTful 或非 RESTful,但这似乎不是问题的核心。
      • 如果您只是创建一个用于按名称搜索的新 URI 模式(如 /personByName/{Name} 那么您最终将为您想到的每个新参数创建一个新模式(以及每个组合这些参数!)。如果您对这就是您所拥有的一切感到满意,那么您当然可以这样做。同样,更标准的方法是使用 /person?name={Name } 返回按姓名匹配的人员列表。
      【解决方案3】:

      我一般同意this answer 的观点,为了清晰和一致,最好避免多个 id 指向同一个实体。

      然而,有时这种情况会自然而然地出现。我使用的一个例子是波兰公司,可以通过他们的税号(“NIP”号)或他们的国家商业登记号(“KRS”号)来识别。

      在这种情况下,我认为应该首先将辅助 id 作为标准添加到搜索端点。因此,用户将能够在辅助 ID 和主 ID 之间“转换”。

      但是,如果用户仍然坚持能够直接通过辅助 id 检索实体(正如我们所经历的那样),另一种可能性是提供文档中未描述的“秘密” URL,执行这样的操作。这可以提供给努力要求它的用户,如果他们决定使用它,那么潜在的歧义和困惑就在于他们,而不是每个阅读文档的人。

      就 API 维护者的歧义和困惑而言,我认为这可以通过辅助函数在每个相关 API 端点的开头立即检测并将辅助 id 转换为主要 id,从而将其保持在合理的最低限度。

      为秘密 URL 选择什么方案显然比正常情况要重要得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2013-12-21
        相关资源
        最近更新 更多