轻松定义资源及其类型的方法

时间:2019-06-12 17:48:05

标签: rest

我有一个典型的设计问题,我需要以RestFul的方式解决。无法找到理想的解决方案。
假设我们有一个资源“车辆”,并且我们希望在同一资源上支持CRUD操作。考虑一下CREATE车辆的情况。

POST /vehicle
{
   "type": "sedan",
   "params": {
      "p1":"v1",
      "p2":"v2"
   }
}

现在可以有很多不同类型的车辆(例如轿车,掀背车,两轮车等)。我想定义一个API,可以获取所有类型的车辆清单。我不确定如何为它定义资源。我能想到的一些选择:

GET /vehicle-types
GET /vehicle/types

上述选项中的哪个选项或其他人们认为更宁静的选项?
这里的输出应该是所有受支持车辆的列表,例如

["sedan", "hatchback", "2wheeler"]

此外,我还希望用户能够发现车辆类型的配置参数。例如

GET /vehicle/types/sedan/params (Not sure of its correct though)

理想情况下,以上返回:

{ 
  "fields": [{"name":"p1", "type":"string", "required":"true"}, 
             {"name":"p2", "type":"string", "required":"false"}]
}

在此处定义资源和资源的最佳方法应该是什么? 感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

如果您想通过用户友好的方式,那么我认为您提到的选项似乎不错, GET /车辆/类型 GET /车辆/类型/轿车/参数 但这不是RESTful方式,因为类型和参数并不是您的最终资源。我假设在这里不能更改资源模型。

因此,如果您想在REST约定中解决此问题,那么我建议使用字段参数在查询参数中指定,这将指定用户需要的字段

GET / vehicle?field = type 结果: [“轿车”,“掀背车”,“两轮车”]

GET / vehicle?field = param 结果:  [{“ name”:“ p1”,“ type”:“ string”,“ required”:“ true”},  {“ name”:“ p2”,“ type”:“ string”,“ required”:“ false”}]

您甚至可以用类似的方式来打印特定汽车的所有配置

获取/ vehicle?type ='sedan'&field = param

如果需要,您可以在逻辑上删除重复的元素

更多信息: 请参阅部分响应部分, https://developers.google.com/drive/api/v3/performance

答案 1 :(得分:0)

  

上述选项中的哪一个或其他人们认为更宁静的选项?

REST不在乎您为资源标识符使用什么拼写。

RFC 3986以这种方式描述路径:

  

path组件包含通常以分层形式组织的数据,该数据与非分层查询组件中的数据(第3.4节)一起用于标识URI方案和命名权限(如果有)范围内的资源)。

因此,在许多设计中,我们选择与 resource 层次结构相匹配的 identifier 层次结构,这使我们能够执行类似使用点段的操作来轻松计算其他附近资源的标识符。

/vehicle/types/sedan/params + .. -> /vehicle/types/sedan
/vehicle/types/sedan/params + ../.. -> /vehicle/types
/vehicle/types/sedan/params + ../../hatchback -> /vehicle/types/hatchback
/vehicle/types/sedan/params + ../../.. -> /vehicle
... and so on.

但是,确定您要使用其他约定没有错。 机器不在乎。

在网络上,我们经常使用参数化的标识符-HTML表单处理定义了如何获取表单输入并将其编码为查询字符串。 URI templates是该想法在pathquery部分中的更广泛模式的扩展。