2014-09-10 53 views
3

问题是,我们有一个复杂的查询字符串的搜索API,并希望让用户有使​​用身体的便利,而不是。所以我们想要允许GET和POST(或者PUT)。可以通过两种HTTP方法暴露REST API吗?

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

回答

3

使用POST直接查询数据是不是好东西,正是因为你提到的原因。如果你的搜索字符串很复杂,也许你可以通过分两个步骤分解查询过程来简化事情 - 一个涉及POST,另一个涉及直接的GET s。

第一步使用POST创建查询模板。查询字符串通过邮件正文发送,成为用户可以通过GET查询的新资源。查询字符串允许使用与SQL查询类似的参数。以在查询会是什么样胡乱猜测,这里有一个例子:

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

你的用户将POST此邮件正文,并获得新的资源标识符回来。这个资源为你的数据标识了一个参数化的“视图”。假设这个视图的资源ID是aabb02kjh。现在,用户可以查询它是这样的:

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

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

+0

Thanks dasblinkenlight ...我也碰到过这个:http://stackoverflow.com/questions/5020704/how-to-design-restful-search-filtering,并让我们想知道可用性(避免复杂的搜索查询字符串)我们可以允许一些RESTlessness :)即使用POST而不是GET – airboss 2014-09-10 14:34:34

+0

@airboss是的,该线程的最高回答谈论基本上相同的事情。 – dasblinkenlight 2014-09-10 15:31:38

+0

我应该接受这个答案,因为它是一个有趣的概念。唯一的问题是多次调用,但优点是定义了查询模板。可能不需要将它作为两个HTTP方法公开,但实际上我不确定它是否是一个通过两种方法公开的好设计。 – airboss 2014-09-10 17:26:50

1

有趣的问题。我的意思是POST - > PUT,DELETE有用于重写HTTP方法共同解决方法:

  • 发送_method隐藏输入域后数据
  • 在URL
  • 发送_method查询参数发送X-HTTP-Method-Override头与后

等等......所以,如果它们是有效的(我不知道这一点),那么你可以使用由GET以及同样的做法。

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

另一个有趣的方法是添加有关URL的link descriptions。 (但这对我来说也是非常新的。)