序言:我对REST的理解充其量是浅薄的,因此欢迎对我的问题进行任何更正或澄清。
我遇到一种情况,我需要RESTful服务的用户提交任意实数正数。因此,我假设我不应该在url中要求它,即使返回的对象应该是相同的,并且应该使用参数(或者这个假设是错误的?)。
鉴于这一点,为了符合REST,参数必须以某种方式被发现吗?我无法找到任何能让我清楚的事情。
如果没有,我进一步假设参数需要以其他方式记录,从而锁定(当前api的一部分),据我所知,这是不可取的,因为资源应该通过以下方式找到超文本链接而不是硬编码位置(在这种情况下是参数)。
假设参数必须是可发现的,有没有办法在tastypie / django中这样做?
答案 0 :(得分:4)
REST的“可发现”部分通常是指服务器返回的以前不存在的新资源(由URI表示)。然后,客户端应用程序可以选择在闲暇时与这些资源进行交互。
例如,我的应用程序可能GET
一个/library
URI,它返回我本地库中的内容的表示。返回的数据(编码为特定的基于JSON的媒体类型)可能如下所示:
{
"printedBooks" : "/library/books",
"audioTapes" : "/library/tapes"
}
现在让我们说几个月后我在相同的URI上执行相同的GET
,现在我可能会返回此有效负载:
{
"printedBooks" : "/library/books",
"audioTapes" : "/library/tapes",
"magazines" : "/library/magazines"
}
现在有一个magazines
资源的新链接,我可能会GET
找出可用的杂志类型。如果我的客户端应用程序不关心它,没什么大不了的 - 它只是像以前一样继续使用其他两个资源。在未来的某个时候,我也可以编写对杂志搜索的支持。
但是,如果我编写了某种可以自动适应这种新资源存在的超级动态幻想客户端应用程序,那么应用程序的用户可以毫不费力地使用它。无需升级:服务器提供了新功能,客户端充分利用了它。 Web浏览器以这种方式工作(虽然人类驱动了很大一部分“动态”)。
关于参数的具体问题:这些参数通常被指定为服务器API文档的一部分。我不知道任何API以自动方式指定参数语法,这将允许客户端100%通用和适应性。
一个定义良好的RESTful API站在它使用的已经指定的技术(HTTP,URI,内容类型协商,标题等)和利用而不是重新定义它们的肩膀上。这就是为什么我知道我可以在GET
URI上执行/library/magazines
并请求基于JSON的编码,而且很可能我会成功。我知道如果我有一个特定杂志的URI(比如/library/magazines/1234
),那么我可以尝试通过调用DELETE
来删除它,我会知道它是否成功基于返回HTTP状态代码。我没有阅读任何文档或使用任何编码魔法来执行任何这些操作,因为这些是已在HTTP中指定的操作。
但是,要通过POST到/library/magazines
创建一个新杂志,我需要知道我的参数数据的表示应该是什么样的,无论我是在URI内还是在URI体内传递这些参数。 POST。这是需要在API文档中指定带外的数据。
因此,总结一下:RESTful服务器可以向客户端发送他们以前从未见过的新信息,这是REST中可发现性的核心。但是当客户想要将数据发送到服务器时,它需要发送服务器将理解和接受的数据,这通常是described in documentation。