首页 > 解决方案 > 将参数包含在 GET 请求的正文而不是 URI 中是 RESTful 吗?

问题描述

我有一个复杂的架构,需要复杂的 API 调用。对于许多资源检索,用户可能希望指定几个参数来过滤结果。在 URI 中包含所有这些参数对于前端开发人员来说似乎很混乱且难以制作,因此我选择将参数作为 JSON 放入请求正文中。不幸的是,这似乎不适用于我正在使用的 Web 后端(Django-Rest 框架)。这是 RESTful,还是我犯了一个错误?

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

标签: restapidjango-rest-framework

解决方案


这是 RESTful,还是我犯了一个错误?

在我看来,你好像犯了一个错误。这种情况下的权威是RFC 7231

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

我的解释是:缓存是网络的重要组成部分;为了使缓存像人们期望的那样工作,它需要兼容的缓存才能将消息正文作为密钥的一部分进行管理。

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

SEARCH 方法扮演查询和结果集的传输机制的角色。它没有定义查询的语义。查询的类型定义了语义。

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

如果这不符合您的需求,您可以查看HTTP 方法注册表以查看其他标准之一是否适合您的用例。

我将如何表示复杂的数据片段,如字符串列表以及数据片段之间的关系?

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

例如,您可以考虑使用RFC 4648 中定义的Base64 编码之一


推荐阅读