2011-11-28 50 views
4

我有一个Java组件扫描一组文件夹(输入/处理/输出)并返回JSON格式的文件列表。设计适当的REST URI

其余网址同样是:

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

现在,我需要在每个文件执行特定操作,如验证,工艺,删除等我不知道的最好的为这些操作设计REST URL的方法。 由于它的直接文件操作,我没有任何文件的唯一标识符,除了它们的路径。所以,我不知道如果下面是一个很好的网址:

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

编辑:我会非常喜欢使用像/文件/ FILEID /验证。但唯一唯一的文件id是它的路径,我不认为我可以将它用作URL本身的一部分。

最后,我不确定哪个HTTP动词用于像验证这样的自定义动作。

在此先感谢!

问候, 阿南德

回答

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 
} 

这是简单的阅读一部分。现在到了写操作

DELETE 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

现在,我需要在每个文件执行特定操作,如验证,工艺,删除等我不知道来设计REST网址的最佳途径为这些行动。由于它的直接文件操作,我没有任何唯一的文件标识,除了它们的路径。所以我不确定以下是一个好的网址:POST http:///file/validate?path=

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

编辑:我理想上喜欢用/file/fileId/validate之类的东西。但唯一唯一的文件id是它的路径,我不认为我可以将它用作URL本身的一部分。

哦,是的,你可以!而你应该这样做。除最后的validate部分;这不是一种资源,所以不应该成为路径的一部分。相反,客户端应该向文件资源发布一条消息,要求它验证自己。幸运的是,POST允许您向文件发送消息并接收一条消息;它非常适合这类事情(除非使用现有的动词来代替标准HTTP或诸如WebDAV之类的扩展之一)。

最后,我不确定哪个HTTP动词用于像验证这样的自定义动作。

POST,执行的操作由发送到资源的消息的内容决定。自定义“做非标准”操作总是映射到POST,当它们无法映射到GET,PUT或DELETE时。 (唉,聪明的POST不是很容易发现的,所以会导致HATEOAS原理出现问题,但这还是比违反基本的REST原则更好。)

1

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

您可以用RESTful方式检查每个文件的有效性的一种方法是将有效性检查视为不是对文件执行的操作,而是将其作为自己的资源右:

​​

这可能会返回特定约束violat的一个简单的真/假,或者一个列表离子。该文件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会为您上传的每个图片创建几个不同的图片文件,每个图片文件的大小都不相同。在这种情况下,你可以把输入文件,然后通过GET-ING相应的输出文件触发处理:

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

如果处理不是近乎即时的,你可以以异步方式生成的输出文件:每一次一个新的输入文件被放入Web服务中,Web服务启动一个异步活动,最终导致输出文件被创建。

+0

根据Fielding的说法,你的第一个陈述是不正确的:“REST风格并不意味着限制这套方法是一个理想的目标。[...]特别是,REST鼓励创建用于模糊操作的新方法,特别是因为我们不想用普遍的方法来试图找出一个特定的操作是否适合99.9%的案例或其他组成0.1%的其中一个逻辑。“资料来源:http://xent.com/pipermail/fork/2001-August/003191.html这就是说,我喜欢你自己的有效性的想法作为一种资源。 – tuespetre

+0

此外,当服务器本身(如Apache)接收到格式错误的请求时(而不是应用程序头脑中的媒体类型变形时),状态码400更多。那将是状态码422不可处理的实体。 – tuespetre