将请求正文与GET请求一起传递不是违反REST风格的方法吗?
例如,过滤Elasticearch中的某些信息
curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
有些工具甚至被设计成在GET请求中避免请求正文(如 Postman )
3条答案
按热度按时间mi7gmzs61#
来自RFC的消息:
GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。
换句话说,这并不是禁止的,但这是一种未定义的行为,应该避免。HTTP客户端、服务器和代理可以自由地丢弃正文,这不会违反标准。这绝对是一种糟糕的做法。
HTTPBis工作组(从事HTTP和相关标准工作的工作组)的进一步案文:
最后,请注意,虽然HTTP允许GET请求在语法上具有正文,但这样做只是为了允许解析器是泛型的;根据RFC7231,第4.3.1节,GET上的正文没有意义,将被通用的HTTP软件忽略或拒绝。
source
brccelvz2#
不是的。不是的。
在REST中,使用
POST
进行查询没有意义。POST
应该修改服务器。在搜索时,您显然不会修改服务器。GET
在这里非常适用。例如,使用以下命令运行搜索有什么不同:
VS
在这两种情况下,您都希望“得到”一些结果。您并不想更改服务器端的任何状态。
这就是为什么我认为
GET
在这里完全适用,无论您是在URI内传递查询还是使用正文。话虽如此,我们知道有些语言和工具不允许这样做。尽管RFC没有提到你不能拥有一个有
GET
的身体。因此,ElasticSearch也支持
POST
。这一点:
也会以同样的方式工作。
bjp0bcyl3#
您可以在ElasticSearch GET请求中使用查询参数:只需添加
source=query_string_body&source_content_type='application/json'
URL将如下所示:
编号:https://discuss.elastic.co/t/query-elasticsearch-from-browser-webservice/129697