RESTAPI可以通过两个HTTP方法公开吗?

RESTAPI可以通过两个HTTP方法公开吗?,api,rest,search,Api,Rest,Search,问题是,我们有一个复杂的搜索api查询字符串,希望让用户能够方便地使用body。因此,我们希望同时允许GET和POST(或PUT) 我知道会有一场关于搜索是只读操作的辩论,它应该只按照REST标准获取。据我所知,PUT对缓存不友好。 但我也知道有时偏离其他标准是可以的。但为了方便客户,有两种方法有意义吗?有趣的问题。我的意思是,通过POST->PUT,DELETE,覆盖HTTP方法有一些常见的解决方法: 发送带有post数据的\u方法隐藏输入字段 在URL中发送\u方法查询参数 用post发送

问题是,我们有一个复杂的搜索api查询字符串,希望让用户能够方便地使用body。因此,我们希望同时允许GET和POST(或PUT)

我知道会有一场关于搜索是只读操作的辩论,它应该只按照REST标准获取。据我所知,PUT对缓存不友好。
但我也知道有时偏离其他标准是可以的。但为了方便客户,有两种方法有意义吗?

有趣的问题。我的意思是,通过POST->PUT,DELETE,覆盖HTTP方法有一些常见的解决方法:

  • 发送带有post数据的
    \u方法
    隐藏输入字段
  • 在URL中发送
    \u方法
    查询参数
  • 用post发送
    X-HTTP-Method-Override
    标题
等等。。。因此,如果它们是有效的(我对此不确定),那么您也可以通过GET使用相同的方法

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


另一个有趣的添加URL的方法。(但这对我来说也很新鲜。)

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

第一步使用
POST
创建查询模板。查询字符串通过消息体发送,并成为用户可以通过
GET
查询的新资源。查询字符串允许使用参数,方式类似于SQL查询。粗略猜测一下您的查询的外观,下面是一个示例:

(userName = $name) || (createdBefore > $asOf && deleted=false)
您的用户将
在消息正文中发布
,并获得新的资源标识符。此资源标识数据中的参数化“视图”。假设此视图的资源id为
aabb02kjh
。现在,您的用户可以这样查询:

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

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

感谢dasblinkenlight…我也遇到了这个问题:为了可用性(避免复杂的搜索查询字符串),我们可以允许一些不安:)即使用POST而不是GET@airboss对这个帖子的最上面的答案基本上讲的是同一件事。我应该接受这个答案,因为它是一个有趣的概念。唯一的问题是多个调用,但优点是定义了查询模板。可能不需要将其作为两个HTTP方法公开,实际上我不确定通过两个方法公开是否是一个好的设计。