【问题标题】:REST API Design queryREST API 设计查询
【发布时间】:2017-10-12 16:58:24
【问题描述】:

我在决定在这种情况下在 REST API 设计中做什么时遇到了问题。

这是我的问题,

我有一个资源域模型,它有一个嵌套对象,它也是一个域模型。

你可以想象这样的事情

{
"name":"abc"
"type":{
        "name":"typeName",
        "description":"description"
       }
}

现在,我希望能够根据内部模型和更多参数获取外部模型资源。

例如,我想获取所有具有给定类型和一些参数(如页码、大小等)的外部模型资源。

所以我的问题,

1.API应该在post中接受inner model,并返回outer model,这是一个很好的rest设计吗?

  1. 如何传递额外的参数?这是一个 POST,不能放在 url 中,也不能放在内部模型中。

我应该创建一个包含这些额外参数和类型资源的新模型吗? 喜欢

{
"page":"10",
"type":{
       "name":"typeName",
       "description":"description"
        }
}

【问题讨论】:

    标签: json rest api restful-architecture restful-url


    【解决方案1】:

    如果您正在创建通用 HTTP 服务,则可以使用 POST 发送复杂查询并获得响应。

    如果您尝试使用 RESTful,那么这是一个不好的做法。你有两个选择。选项 1 是找到一种在 URL 中对查询进行编码的方法,以便您可以使用 GET 请求。

    选项 2 涉及更多。我不一定会说我会建议这样做,但这是一种在进行复杂查询时绕过 REST 约束的方法。

    这个想法是您使用POST 创建一个“查询”资源。几乎就像你在做一个服务器端准备好的语句,然后使用GET 来获取查询结果。

    客户端->服务器对话示例:

    POST /queries
    Content-Type: application/json
    ...
    

    对此的回应可能是:

    HTTP/1.1 201 Created
    Location: /queries/1234
    Link: </queryresults/1234>; rel="some-relationship-identifier"
    

    然后,您可以在 /queries/1234 上执行 GET 以查看您“准备”的查询,并在 /queryresults/1234 上执行 GET 以查看实际报告。

    这样做的好处是它不受 REST 的约束,并且您可能会重复使用查询并花费更长的时间来生成结果。

    明显的缺点是很难向 API 的使用者解释这一点,因为不是每个人都可能熟悉这种模式,而且它是一个额外的 HTTP 请求。

    所以你必须做出决定:

    • 值得这样做吗?
    • 您能否在 URI 中对查询进行编码以完全避免这种情况
    • 也许您对 RESTful 不够关心,而您可能只想打破规则并使用 POST 处理一些复杂的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2015-07-24
      相关资源
      最近更新 更多