【问题标题】:What's the correct way to create a REST service that allows for different types of identifiers?创建允许不同类型标识符的 REST 服务的正确方法是什么?
【发布时间】:2015-07-06 23:11:23
【问题描述】:

我需要创建一个 RESTful Web 服务,允许使用不同类型的 ID 来寻址实体。我会给你一个基于书籍的例子(这不是我需要处理的,但我想通过这种方式建立一个共同的理解)。

书籍可以通过以下方式识别:

  • 国际标准书号 13
  • 身份证
  • 标题

我可以通过POSTing 到/api/v1/books/The%20Bible 创建一本书。这本书以后可以通过其 ISBN /api/v1/books/12312312301 或 ID /api/v1/books/A9471IZ1 寻址。如果我以这种方式实现它,我将需要分析发送的任何标识符并在内部进行转换。

将标识符类型添加到 URL 是否“合法”?喜欢/api/v1/books/title/The%20Bible

【问题讨论】:

  • 当然是legal,您正在确定处理标题、ISBN 等的路线,这没有错。

标签: web-services rest


【解决方案1】:

首先:RESTful URl 应该只包含名词而不是动词。你可以在网上找到很多最佳实践,例如:RESTful API Design: nouns are good, verbs are bad

一种方法是检测代码中的 id/标识符。 正如您已经提到的那样,该模式将是:

GET /api/v1/books/{id}, like /api/v1/books/12312312301 or /api/v1/books/The%20Bible

与 this.lau_ 类似的另一种方法是使用查询参数。但我建议将查询参数添加到书籍网址(因为只有名词,没有动词):

GET /api/v1/books?isbn=12312312301

更好的解决方案?不确定… 因为您选择的是“一本书的 ID”(除了标题),而不是执行查询/搜索,我更喜欢第一种方法(.../books 应该返回“书籍集合”和 .../books/{id}应该只返回一本书)。

但也许有人有更好的方法/想法?

编辑: 我建议避免将标识符添加到 URL,它有“难闻的气味”。但这也是一种可能的方法,我在其他 API 中看到了很多。让我们看看我能不能找到一些关于这方面的信息,如果它“可以”还是应该避免。

编辑 2: 见REST API DESIGN - Getting a resource through REST with different parameters but same url patternREST - supporting multiple possible identifiers

【讨论】:

  • 好的,我想我明白了基本的想法。因此,如果我需要上传任何书籍的封面图片,这将成为 POST/api/v1/books/cover?isbn=12312312301
  • @Marged 要将封面上传到特定书籍,URL 应如下所示:POST /api/v1/books/{id}/cover,在您的情况下为 /api/v1/books/12312312301/cover
【解决方案2】:

您似乎需要的不仅仅是检索资源,而是按特定条件(在您的情况下,按 ISBN、标题或 ID)搜索它们。在这种情况下,与其使您的 /books 端点复杂化(理想情况下,它应该只按 ID 返回书籍),不如创建一个单独的 /search 函数。然后,您可以使用它按任何领域搜索书籍。

例如,你会:

GET /search?title=bible

GET /search?isbn=12312312301

以后甚至可以轻松扩展以添加更多字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2021-08-24
    • 2020-05-26
    • 1970-01-01
    • 2017-11-18
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多