我有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。
您会推荐以下哪种方法?什么是最直观的?或者你会推荐其他任何其他选择吗?
答案 0 :(得分:0)
是的,绝对可以,也是个好主意,特别是如果帖子数据很大,因为它可能会超过最大网址长度。它作为信息正文的一部分而不是网址更好。
答案 1 :(得分:0)
简单地根据HTTP规范,POST
不是为查询发送大量数据的有效方法,因为意图是请求的主体是由服务器以某种方式存储,在您的示例中不是这种情况。
我当前的项目遇到了同样的问题,我们决定使用更正确的GET
和许多模板化查询参数。尽管支持了十几个查询参数,这些参数的长度可能很长,但大多数服务器都指定GET
请求最大长度为8KB,我希望这个数量足够多。如果您尝试发送带有大量相同查询参数的GET
来描述长列表,我认为可以达到此限制,但如果是这种情况,那么它会建议退一步看这是如何成为API的要求。
在我看来,GET
是最直观和最清晰的用法,并且肯定似乎是“正确的”RESTful实现。如果请求的大小对您来说是一个问题,并且您控制了要部署的环境,则甚至可以增加服务器的最大请求大小。