在GET请求中包含参数是RESTful吗’;是谁的主体而不是URI?

在GET请求中包含参数是RESTful吗’;是谁的主体而不是URI?,rest,api,django-rest-framework,Rest,Api,Django Rest Framework,我有一个复杂的模式,需要复杂的API调用。对于许多资源检索,用户希望指定几个参数来过滤结果。将所有这些参数都包含在URI中似乎会让前端开发人员感到混乱和困难,因此我选择将这些参数作为JSON放入请求体中。不幸的是,这似乎不适合我使用的web后端(Django Rest框架)。这是休息,还是我弄错了 作为后续问题,如果我将参数放在URI中,我将如何表示复杂的数据片段(如字符串列表)以及数据片段之间的关系 这是休息,还是我弄错了 我觉得你好像犯了一个错误。本案中的权威是 GET请求消息中的有效负载没

我有一个复杂的模式,需要复杂的API调用。对于许多资源检索,用户希望指定几个参数来过滤结果。将所有这些参数都包含在URI中似乎会让前端开发人员感到混乱和困难,因此我选择将这些参数作为JSON放入请求体中。不幸的是,这似乎不适合我使用的web后端(Django Rest框架)。这是休息,还是我弄错了

作为后续问题,如果我将参数放在URI中,我将如何表示复杂的数据片段(如字符串列表)以及数据片段之间的关系

这是休息,还是我弄错了

我觉得你好像犯了一个错误。本案中的权威是

GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效负载正文可能会导致某些现有实现拒绝该请求

我的解释是:缓存是web的重要组成部分;要使缓存像人们期望的那样工作,需要兼容的缓存能够将消息体作为密钥的一部分进行管理

可以更好地满足您需求的HTTP方法是

搜索方法充当查询和结果集的传输机制。它没有定义查询的语义。查询的类型定义了语义

搜索是一种安全的方法;除了执行查询并返回查询结果之外,它没有任何意义

如果这不符合您的需求,您可以查看其他标准之一是否符合您的用例

如何表示复杂的数据片段(如字符串列表)以及数据片段之间的关系

真正的答案是“您想要的任何方式”——源服务器可以控制其URI空间,编码到其中的任何信息都是在服务器方便的情况下进行的,以供自己使用


您可以考虑使用RFC 4648 < /P> < P>中的一个,从我读到的关于REST的代码中,您只能使用<代码>获取< /代码>,<代码> POST <代码>,<代码>放置< /代码>,<代码>修补程序< /代码>,和<代码>删除< /代码> .<

GET
DELETE
不应包含正文。正如@VoiceOfUnreason所提到的,这主要是因为缓存在沿着
GET
处理主体时会遇到困难。这就是说,如果您的结果从未被缓存,那就根本不应该担心。(即,从服务器返回
缓存:无缓存
和其他类似的HTTP头。)

在查询字符串和支持列表或JSON等方面没有真正的约定。如果您想保留一个
GET
,那么可以使用编码的JSON字符串。除了URL的长度之外,这没有问题

http://www.example.com/?query=<encoded-json>
在这种情况下,这些语言将转换数组中的值
$\u GET['var'][1]
然后将返回
123


这不是约定,只是特定环境的扩展。

搜索
方法的可能副本并不完全是RESTful的一部分,RESTful仅限于
获取
发布
放置
补丁
删除
。现在我个人认为,使用WebDAV和任何其他您想要支持的命令都是可以的,只要您正确地记录它们(这可能非常困难,因为HTTP协议有大量古怪的规则!)
path/?var[1]=123&var[2]=456&var[3]=789