POST获取REST资源 - 三种方法 - 您会推荐哪一种?

时间:2014-06-16 06:45:30

标签: rest post get hateoas

我有REST资源(例如:门票)。为了能够获得与给定约束集匹配的一组票证(例如:开始日期,结束日期,价格和其他标准),用户将需要传递信息。此信息可以作为查询参数包含在内,协议可以定义:

GET: Tickets?start-date=date&end-date=date&price=someprice...

要传递的约束集可能很多。 在这种情况下,最好是使用POST并将约束集作为JSON对象传递给正文吗?

POST: Tickets
Body:
 {
   "start-date": "date"
   "end-date" : "date"
   . . .
 }

这种方法的缺点是什么?它是否仍然符合REST准则?Ref:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

另一种选择是客户端可以创建一个名为" Constraints"在服务器上,获取约束id(例如:123)作为响应。然后它可以使用:

GET: Tickets?constraints-id=123

但这意味着服务器将定期过期并删除" Constraint"对象,因为客户可能会在没有完成业务流程的情况下继续创建这些对象(例如:最后没有确认票证)

第三种方法仍然可以使用POST,但不能创建任何资源。我们可以使用这样的URI方案:

POST: Tickets\Constraints
Body:
   Body:
     {
       "start-date": "date"
       "end-date" : "date"
       . . .
     }
Response:
200 OK ...
Tickets

这意味着虽然服务器上没有创建任何资源,但仍然需要POST约束来获取Tickets。

您会推荐以下哪种方法?什么是最直观的?或者你会推荐其他任何其他选择吗?

2 个答案:

答案 0 :(得分:0)

是的,绝对可以,也是个好主意,特别是如果帖子数据很大,因为它可能会超过最大网址长度。它作为信息正文的一部分而不是网址更好。

答案 1 :(得分:0)

简单地根据HTTP规范,POST 是为查询发送大量数据的有效方法,因为意图是请求的主体是由服务器以某种方式存储,在您的示例中不是这种情况。

我当前的项目遇到了同样的问题,我们决定使用更正确的GET和许多模板化查询参数。尽管支持了十几个查询参数,这些参数的长度可能很长,但大多数服务器都指定GET请求最大长度为8KB,我希望这个数量足够多。如果您尝试发送带有大量相同查询参数的GET来描述长列表,我认为可以达到此限制,但如果是这种情况,那么它会建议退一步看这是如何成为API的要求。

在我看来,GET是最直观和最清晰的用法,并且肯定似乎是“正确的”RESTful实现。如果请求的大小对您来说是一个问题,并且您控制了要部署的环境,则甚至可以增加服务器的最大请求大小。