可以通过两种HTTP方法暴露REST API吗?
问题是,我们有一个复杂的查询字符串的搜索API,并希望让用户有使用身体的便利,而不是。所以我们想要允许GET和POST(或者PUT)。可以通过两种HTTP方法暴露REST API吗?
据我所知,将会有一场关于搜索作为只读操作的争论,它应该只按照REST标准进行GET。也理解,PUT不是缓存友好的。 但我也知道它有时会偏离REST标准。但为了客户的方便,有两种方法有意义吗?
使用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,但它允许用户定义和重用查询模板非常简单和标准的查询字符串。
有趣的问题。我的意思是POST - > PUT,DELETE有用于重写HTTP方法共同解决方法:
- 发送
_method
隐藏输入域后数据 - 在URL
- 发送
_method
查询参数发送X-HTTP-Method-Override
头与后
等等......所以,如果它们是有效的(我不知道这一点),那么你可以使用由GET以及同样的做法。
根据REST约束:缓存和统一接口以及HTTP方法定义,您必须通过检索请求使用GET。只有少数URL查询语言可以使URL可读,例如RQL,但是您可以随时选择您喜欢的查询语言并将其序列化为URL使用...
另一个有趣的方法是添加有关URL的link descriptions。 (但这对我来说也是非常新的。)
Thanks dasblinkenlight ...我也碰到过这个:http://stackoverflow.com/questions/5020704/how-to-design-restful-search-filtering,并让我们想知道可用性(避免复杂的搜索查询字符串)我们可以允许一些RESTlessness :)即使用POST而不是GET – airboss 2014-09-10 14:34:34
@airboss是的,该线程的最高回答谈论基本上相同的事情。 – dasblinkenlight 2014-09-10 15:31:38
我应该接受这个答案,因为它是一个有趣的概念。唯一的问题是多次调用,但优点是定义了查询模板。可能不需要将它作为两个HTTP方法公开,但实际上我不确定它是否是一个通过两种方法公开的好设计。 – airboss 2014-09-10 17:26:50