如何使用长URL进行RESTful?

REST架构表示资源状态也应该获得一个URL。

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

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

是否有一种REST风格的方式来解决非常大的URL不涉及POST请求?


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

客户端使用请求正文中的查询详细信息向queries资源发出POST请求。

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

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


卢茨霍恩已经很好地回答了它。 但客户端可能不希望进行三种API调用 - 一种是创建查询响应,另一种是获取它,第三种是删除它。

如果您确定查询长度将保持小于8 KB(这是大多数Web服务器获取查询长度的限制),请继续使用GET请求。 此外,如果您对缓存不感兴趣,请使用post,如果您很清楚后果,那么偶尔忽略REST没有任何问题。

链接地址: http://www.djcxy.com/p/42171.html

上一篇: How to be RESTful with long URLs?

下一篇: WCF GET URL Length Limit Issue: Bad Request