Rest'指南'使API设计变得困难

时间:2015-02-20 15:26:45

标签: rest restful-url restful-architecture

我正在尝试为我的Rest服务创建一个API,我正在努力应对我试图遵循的设计规则。一般来说,我试图遵循(以及其他)这些指导方针:

  1. 不要在URI中使用动词
  2. 更改状态时不要使用查询参数
  3. 使用复数
  4. 不要使用驼峰案
  5. 现在,我必须建模如下:

    • 获取公司的所有部门
    • 获取公司部门
    • 删除公司的所有部门
    • 删除公司的部门

    我正在尝试这样的事情:

    GET company/departments
    GET company/departments/<depName>
    DELETE company/departments
    DELETE company/departments  {body: department name}
    

    以上,遵循我提到的指南,但我真的不认为结果URI是好的。特别是第四个,做不同的工作,并且具有与第三个相同的URI。

    这对我来说是一个常见的问题,我在设计REST服务时遇到过很多次。结果是我总是打破一些设计原则来实现我想要的或制造更丑陋的URI(例如:DELETE公司/部门/部门)。


    所以实际的问题是:

    在我的设计中,如何删除具有类似Restfull的URI的单个部门?

3 个答案:

答案 0 :(得分:4)

RESTful URI的更好设计是使用资源的标识符。在这种情况下,资源就是部门。

所以你的URI可能如下所示:

GET company/departments  
GET company/departments/<department-id>  
DELETE company/departments  
DELETE company/departments/<department-id>  

例如......

DELETE company/departments/58491

通过使用标识符而不是部门名称,这可以避免URI中的空格,这是不可取的。按部门名称,我假设您的用户友好显示名称,例如&#34;人力资本管理。&#34;

答案 1 :(得分:3)

网址由以下几部分组成:

http://example.com/company/departments/12345?arg1=this&arg2=that

http:是计划。 //example.com是房东。 /company/departments/12345是路径,?arg1=this&arg2=that是查询字符串,由两个参数组成:arg1和arg2。还有另一个方面,称为矩阵参数,这里不再讨论。

当REST谈论URL时,它指的是整个事物。不是它的一部分。要将REST整个URL视为不透明的blob。

这意味着REST不关心任何特定部分:方案,主机,路径或参数。

就REST而言,

ftp://127.0.0.1/E280F814-1524-41D5-8735-43D8414AE242是一个非常好的URL。

就REST而言,它不会给你在URL中使用的路径或是否使用参数。

也就是说,针对URL中的参数的建议是因为有时,缓存不会正确地缓存参数化的URL。因此,/company/department/12345优先于/company/department?id=12345

路径中的12345不是参数。它是资源的名称。就像上面的starwars.mp4不是参数一样,也不是E280F814-1524-41D5-8735-43D8414AE242。他们只是名字。唯一真正关心的人是人。电脑不关心,互联网不关心,REST不关心。对他们来说,这只是一切。

所以这听起来像是一个简单的错误传达,你正在战斗。尽量不要过分强调它。无论如何,当URL资源及其表示实际上很重要时,会对URL命名施加过多的权重。

答案 2 :(得分:0)

我同意。您应该使用如下所示的URL删除部门。此类URL标识部门,可用于对其执行HTTP操作。请勿在请求的有效内容中提供部门ID或名称。

DELETE company/departments/58491

以下链接可为您提供有关设计RESTful服务的更多详细信息:https://templth.wordpress.com/2014/12/15/designing-a-web-api/

希望它可以帮到你, 亨利