是否可以通过两种HTTP方法公开REST API?

时间:2014-09-10 13:09:46

标签: api rest search

问题是我们有一个复杂的搜索API查询字符串,并希望让用户方便使用body。所以我们想要允许GET和POST(或PUT)。

我理解将会有一个关于搜索是一个只读操作的争论,它应该只按照REST标准进行GET。据我所知,PUT也不是缓存友好的。 但我也知道,有时可以偏离REST标准。但是为客户提供方便两种方法是否有意义?

2 个答案:

答案 0 :(得分:3)

直接使用POST查询数据是一件好事,正是由于您提到的原因。如果您的搜索字符串很复杂,也许您可​​以通过两个步骤拆分查询过程来简化操作 - 一个涉及POST,另一个涉及直接GET

第一步使用POST创建查询模板。查询字符串通过邮件正文发送,并成为用户可以通过GET查询的新资源。查询字符串允许参数,类似于SQL查询。粗略猜测一下查询的外观,这是一个例子:

(userName = $name) || (createdBefore > $asOf && deleted=false)

您的用户会在邮件正文中POST,并获取新的资源标识符。此资源标识数据中的参数化“视图”。假设此视图的资源ID为aabb02kjh。现在,您的用户可以像这样查询:

https://app.yourserver.net/aabb02kjh?name=airboss&asof=20140101

这会增加API的复杂性,但它允许用户使用非常简单和标准的查询字符串定义和重用查询模板。

答案 1 :(得分:1)

有趣的问题。我的意思是POST - > PUT,DELETE有一些常用的替代HTTP方法的解决方法:

  • 发送带有帖子数据的_method隐藏输入字段
  • 在网址
  • 中发送_method查询参数
  • 使用帖子发送X-HTTP-Method-Override标题

等......所以如果它们有效(我不确定),那么你也可以通过GET使用相同的方法。

根据REST约束:缓存和统一接口以及HTTP方法定义,您必须通过检索请求使用GET。只有少数URL查询语言可以使URL可读,例如RQL,但您可以随时选择自己喜欢的查询语言并将其序列化以用于URL使用...

另一种有趣的方法是在网址上添加link descriptions。 (但这对我来说也是非常新的。)