正如OO经常涉及参数是对象的方法一样,REST似乎不可避免地会导致需要将资源作为参数传递。怎么做才是最好的呢?
一种方式似乎是资源的标量键是参数。因此,我们可能会传递fooid=21
来标识foo类型的资源。可能单个标量不足以标识资源,因此我们可能需要传递footype=a&fooelement=2
。这看起来不是很好,因为不清楚这些标量参数实际上是连接在一起的,并且引用了单个资源。
实际上,如果参数是一个资源,它不应该被它的URI引用吗?所以我们可能想要传递更多像/foo/21
或/foo/a/2
这样的东西。但是还有一个问题,那就是调用什么参数。应该是foo=/foo/21
吗?可能不会。一个明显的缺陷是资源现在被过度指定了。我们知道/foo/21
是foo资源的一个实例,没有被告知更多信息,我们也不希望它能够编写bar=/foo/21
。
我们并不真正想要一个完全中立的参数名称,比如resource=/foo/21
,因为如果有多个参数是一个资源,那么它就没有什么信息,而且很难使用。
因此,参数名称可能应该描述参数与提供该参数的资源/方法之间的交互。但是找到一个合适的描述有多容易呢?
有没有人对这些问题有什么想法?
发布于 2013-11-08 12:09:53
基本上,您是对的,资源应该通过其完整的URI来引用。这是最佳实践。句号。过度指定它是错误的,因为URI的语义对REST是透明的。客户端或服务器不应该依赖URI来推断资源的类型。这就是媒体类型头的作用。
如何命名参数实际上取决于与父资源的关系。例如,如果您有一个汽车资源和一个驱动程序资源,只要汽车媒体类型的文档清楚地说明了current_driver是什么,那么使用car.current_driver = 'http://myapi/drivers/12'
就没有错。当试图通过任何方法设置Driver时,Car资源不应该接受任何内容,只接受媒体类型为Driver的资源。
https://stackoverflow.com/questions/19858536
复制