设计适当的REST URI

时间:2011-11-28 08:22:57

标签: http url rest uri

我有一个Java组件,它扫描一组文件夹(输入/处理/输出)并返回JSON格式的文件列表。

相同的REST URL是:

GET http://<baseurl>/files/<foldername>

现在,我需要对每个文件执行某些操作,例如验证,处理,删除等。我不确定为这些操作设计REST URL的最佳方法。 由于它是直接文件操作,我没有任何文件的唯一标识符,除了它们的路径。所以我不确定以下是否是一个好网址:

POST http://<baseurl>/file/validate?path=<filepath>

编辑:理想情况下我会喜欢使用/ file / fileId / validate之类的东西。但文件的唯一唯一ID是它的路径,我认为我不能将其作为URL本身的一部分使用。

最后,我不确定哪个HTTP谓词可用于像validate这样的自定义操作。

提前致谢!

此致 阿南德

3 个答案:

答案 0 :(得分:2)

当您实施类似http:///file/validate?path的路由时,您在资源中编码的动作在建模资源服务时不会产生预期效果。

您可以针对阅读操作

执行以下操作

GET http://api.example.com/files会将所有文件作为网址引用返回,例如

http://api.example.com/files/path/to/first
http://api.example.com/files/path/to/second
...

GET http://api.example.com/files/path/to/first将返回文件的验证结果(我使用JSON以提高可读性)

{
   name : first,
   valid : true
}

这是简单的只读部分。现在进入写入操作

删除http://api.example.com/files/path/to/first当然会删除文件

建模文件处理是困难的部分。但您可以将其建模为顶级资源。那样:

POST http://api.example.com/FileOperation?operation=somethingweird将创建虚拟文件处理资源并执行URL参数'operation'给出的操作。将这些文件操作建模为资源使您可以异步执行操作并返回结果,从而提供有关操作过程的其他信息等。

您可以查看Amazon S3 REST API,了解有关如何建模资源的其他示例和灵感。我强烈建议您阅读RESTful Web Services

答案 1 :(得分:1)

  

现在,我需要对每个文件执行某些操作,例如验证,处理,删除等。我不确定为这些操作设计REST URL的最佳方法。由于它是直接文件操作,我没有任何唯一标识的文件,除了它们的路径。所以我不确定以下内容是否是一个好网址:POST http:///file/validate?path=

不是。 /file/validate没有描述资源,它描述了一个动作。这意味着它是功能性的,而不是RESTful。

  

编辑:理想情况下我会喜欢使用类似/file/fileId/validate的内容。但文件的唯一唯一ID是它的路径,我认为我不能将其作为URL本身的一部分使用。

哦,是的,你可以!你应该做到这一点。除了最后的validate部分;这不是任何方式的资源,因此不应该成为路径的一部分。相反,客户端应将消息发送到文件资源,要求它自行验证。幸运的是,POST允许您向文件发送消息以及接收一个消息;它是这类事物的理想选择(除非使用现有的动词,无论是标准HTTP还是其中一个扩展名,如WebDAV)。

  

最后,我不确定哪个HTTP动词可用于此类自定义操作,如验证。

POST,执行的操作由POST到资源的消息内容决定。当无法映射到GET,PUT或DELETE时,自定义“执行非标准操作”操作始终映射到POST。 (唉,一个聪明的POST不是很容易被发现,因此会导致HATEOAS原则出现问题,但这仍然比违反基本的REST原则要好。)

答案 2 :(得分:1)

REST需要一个统一的接口,在HTTP中意味着将自己限制为GET,PUT,POST,DELETE,HEAD等。

以RESTful方式检查每个文件的有效性的一种方法是将有效性检查视为对文件执行的操作,而不是作为资源本身:

GET /file/{file-id}/validity

这可能会返回一个简单的True / False,或者可能返回特定约束违规的列表。 file-id可以是文件名,整数文件号,URL编码路径,也可以是未编码的路径,如:

GET /file/bob/dir1/dir2/somefile/validity

另一种方法是要求提供无效文件列表:

GET /file/invalid

还有一种方法是防止无效文件首先被添加到您的服务中,即当您的服务处理带有错误数据的PUT请求时:

PUT /file/{file-id}

它使用HTTP 400(错误请求)拒绝它。 400响应的主体可以包含有关特定错误的信息。

更新:要删除文件,您当然会使用标准HTTP REST动词:

DELETE /file/{file-id}

要“处理”文件,是否会从上传的文件创建新文件(资源)?例如,Flickr会为您上传的每个图像文件创建几个不同的图像文件,每个文件都有不同的大小。在这种情况下,您可以输入一个输入文件,然后通过获取相应的输出文件来触发处理:

PUT /file/input/{file-id}     
GET /file/output/{file-id}

如果处理不是接近瞬时,则可以异步生成输出文件:每次将新输入文件PUT导入Web服务时,Web服务都会启动异步活动,最终导致输出文件为创建