django - RESTful 服务参数必须是可发现的吗?

标签 django rest parameters tastypie discoverability

序言:我对 REST 的理解充其量是肤浅的,因此欢迎对我的问题进行任何更正或澄清。

我有一种情况,我需要 RESTful 服务的用户提交一个任意的实数。因此,我假设我不应该在 url 中要求它,即使返回的对象应该是相同的,并且应该使用参数代替(或者这个假设是错误的?)。

鉴于此,要符合 REST,参数是否必须以某种方式可发现?我一直无法找到任何让我清楚这一点的东西。

如果没有,我进一步假设参数需要以其他方式记录,从而锁定(一部分)您当前的 api,据我所知,这是不可取的,因为应该通过以下超文本链接找到资源,而不是而不是硬编码位置(以及在这种情况下的参数)。

假设参数必须是可发现的,那么在tastypie/django 中是否有某种方法可以做到这一点?

最佳答案

REST 的“可发现”部分通常是指新的 资源 (由 URI 表示)由之前不存在的服务器返回。然后,客户端应用程序可以选择在闲暇时与这些资源进行交互。

例如,我的应用程序可能 GET /library返回我的本地库中内容的表示形式的 URI。返回的数据(编码为特定的基于 JSON 的媒体类型)可能如下所示:

{
   "printedBooks" : "/library/books",
   "audioTapes" : "/library/tapes"
}

现在让我们说几个月后我做同样的事情 GET在同一个 URI 上,我现在可能会返回此有效负载:
{
   "printedBooks" : "/library/books",
   "audioTapes" : "/library/tapes",
   "magazines" : "/library/magazines"
}

现在有一个指向 magazines 的新链接我大概可以的资源GET找出有哪些类型的杂志。如果我的客户端应用程序不关心它,没什么大不了的 - 它只是像以前一样继续使用其他两个资源。在 future 的某个时候,我也可能会编写对杂志搜索的支持。

但是,如果我编写了某种可以自动适应这种新资源的存在的 super 动态奇特客户端应用程序,那么该应用程序的用户就可以毫不费力地使用它。无需升级:服务器提供了新功能,客户端充分利用了它。 Web 浏览器以这种方式工作(尽管人类驱动了很大一部分“动态”)。

关于参数的具体问题:这些通常被指定为服务器 API 文档的一部分。我不知道有任何 API 以自动方式指定参数语法,允许客户端 100% 通用和适应性强。

定义良好的 RESTful API 站在它使用的已指定技术(HTTP、URI、内容类型协商、 header 等)的肩膀上,并利用而不是重新定义它们。这就是为什么我知道我可能会做一个 GET/library/magazines URI 并请求基于 JSON 的编码,我很可能会成功。我知道如果我有特定杂志的 URI(比如 /library/magazines/1234),那么我可以尝试通过调用 DELETE 来删除它。在它上面,我会根据返回的 HTTP 状态代码知道它是否成功。我不需要阅读任何文档或使用任何编码魔法来完成任何这些事情,因为这些操作已经在 HTTP 中指定。

但是,要通过 POST 到 /library/magazines 创建新杂志,我需要知道我的参数数据的表示形式应该是什么样的,无论我是在 URI 内还是在 POST 正文内传递这些参数。这是需要在 API 文档中指定带外的数据。

因此,总而言之:RESTful 服务器可以向客户端发回他们以前没有看到的新信息,这是 REST 中可发现性的核心。但是当客户端想要向服务器发送数据时,它需要发送服务器能够理解和接受的数据,通常是 described in documentation .

关于django - RESTful 服务参数必须是可发现的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202312/

相关文章:

python - 如何动态地将 html 类添加到 Django 模板 'for-loop'?

python - 使用 python-rtkit 创建票证

ruby-on-rails - Rails、REST 架构和 HTML 5 : Cross domain requests with pre-flight requests

Django 使用 `method==' POST' :` 检查每个 View 是否有好处

actionscript-3 - Flash CC 中的可检查参数未获取值

validation - 将 ValidateScript 与稍后在脚本中定义的自定义函数一起使用

python - 正确设置 UWSGI 路径

django - 如何自定义django管理员更改页面以返回到 “save”上的特定URL

python /Django : How to detect and avoid import name conflict?

C#:带有 POST 参数的 HttpClient