如何使用长URL进行RESTful?

时间:2015-06-10 21:31:59

标签: rest url get

REST架构表示资源状态也应该获取URL。

我正在制作一个包含大量查询的小应用程序。我想为每个查询生成URL,但查询通常大于URL字符限制。我尝试使用URL缩短器,但我的URL对于他们来说太大了。

网上有很多人建议使用POST,但这不是幂等的。我真的不想限制我的查询长度,URL应该能够识别无限量的资源。

是否有一种RESTful方法来处理不涉及POST请求的非常大的URL?

2 个答案:

答案 0 :(得分:3)

要以RESFtul方式对此进行建模,请将查询视为资源。它们可以被创建,检索并最终删除。

客户端向POST资源发出queries个请求,其中包含请求正文中的查询详细信息。

POST /queries
Content-Type: application/json

{
  "condition1":
  {
    "on": "field1",
    "comparison": "equals",
    "value": 42
  },
  "condition2":
  {
    "on": "field2",
    "comparison": "like",
    "value": "foo%"
  }
}

这会创建一个新的查询资源。服务器将回复:

201 Created
Location: /queries/D560EC80-1006-11E5-80F6-75919330F945

路径段D560EC80-1006-11E5-80F6-75919330F945将是服务器为此特定查询生成的ID。

然后客户端请求此查询资源的状态。

GET /queries/D560EC80-1006-11E5-80F6-75919330F945

服务器使用查询结果进行响应。

200 OK
Content-Type: application/json

{
  "id": "D560EC80-1006-11E5-80F6-75919330F945",
  "querydetails":
  {
    "condition1":
    {
      "on": "field1",
      "comparison": "equals",
      "value": 42
    },
    "condition2":
    {
      "on": "field2",
      "comparison": "like",
      "value": "foo%"
    }
  },
  "result":
  {
    "length": 12,
    "results":
    [
      {
        // details about the first hit
      },
      // more hits
    ]
  }
}

稍后,客户端可以删除查询。

DELETE /queries/D560EC80-1006-11E5-80F6-75919330F945

或者服务器可以在一段时间后自动删除查询。

答案 1 :(得分:0)

Lutz Horn的回答非常好。但很可能客户端可能不希望进行三次api调用 - 一次创建查询响应,第二次获取,第三次删除。

如果您确定查询长度仍然小于8 KB(这是大多数Web服务器获取查询长度的限制),请继续使用GET请求。 此外,如果你对缓存不感兴趣,请使用post,如果你很清楚后果,忽略REST就没有错。