创建具有关系

时间:2017-09-11 13:28:08

标签: rest web-services

我想创建一些端点来检索每个国家/地区的异常,startTime和endTime但我不知道构建端点的正确方法是什么,我一直在与我的同事交谈,我们对如何获得不同的意见做到这一点:

选项1路径参数

  • / countries / {countryCode} / exceptions?startTime = {value}& endTime = {value} :获取特定时间段内每个国家/地区的所有例外情况

  • / countries / * / exceptions?startTime = {value}& endTime = {value} :获取特定时间范围内的所有例外情况

选项2查询参数

  • / exceptions?country = {countryCode}& startTime = {value}& endTime = {value} :获取某个时间段内每个国家/地区的所有例外情况

  • / exceptions?startTime = {value}& endTime = {value} :获取特定时间范围内的所有例外情况

选项3路径参数的顺序不同

  • / exceptions / countries / {countryCode}?startTime = {value}& endTime = {value} :在特定时间范围内获取每个国家/地区的所有例外情况

  • / exceptions?startTime = {value}& endTime = {value} :获取特定时间范围内的所有例外情况

所有3个选项都有利有弊,但我们不同意哪种选择最佳。问题是创建这些端点的最佳选择是什么。

4 个答案:

答案 0 :(得分:3)

如果例外需要国家/地区,即例外国家的子资源>,考虑:

/countries/{countryCode}/exceptions?startTime={value}&endTime={value}

否则,您可以将例外作为单独的资源进行管理:

/exceptions?country={countryCode}&startTime={value}&endTime={value}

答案 1 :(得分:3)

显示层次结构时应使用路径参数,例如要显示响应id为{id}的博客的所有评论,您将形成此端点:

/blogs/{id}/comments

如果您希望根据时间过滤这些注释,可以使用查询参数:

/blogs/{id}/comments?start={start}&end={end}

但是,在您的情况下,根据您的问题,您似乎有一个包含例外的大型列表。可以根据各个方面过滤此列表:

  • 国家/地区
  • 时间

由于这些属性不是结构层次结构的一部分(基于您的问题的上下文),而只是提供有关异常的更多信息的属性,因此将它们作为要过滤的查询参数捕获是有意义的,因此:

/exceptions?country={countryCode}&startTime={value}&endTime={value}

答案 2 :(得分:1)

选项2 其中Exception是一个单独的第一级实体,端点接受可选国家/地区代码,因为过滤属性最基于对您的要求的有限描述。

答案 3 :(得分:0)

您很难选择哪个答案是正确的,大多数答案似乎都指出您的选项2 是正确的选择:)

就我而言,导致我使用REST架构时遇到的麻烦更少的原因是考虑到每个资源都只有这些表单,返回列表(可能已过滤)或资源:

/mainResources
/mainResources/:id

/mainResources/:id/:relatedResources是别名 /relatedResources?mainResourceId[]=...(返回已过滤的列表)

您的选项2 可让您自由添加更多关系,例如 /exceptions?country={countryCode}&anotherResource={anotherResourceId}&startTime={value}&endTime={value}

如果您将其他选项视为别名,则其他选项不兼容。

我可以考虑采用诸如/mainResource/:id/subResource之类的URL的另一个原因是非规范化关系,例如:

{
   'attribute1': 'value1'
   'attribute2': 'value2'
   'attribute3': 'value3'
   'subResource': {
       'attribute4': 'value4',
       'attribute5': 'value5'
   }
}

然后那种URL可以返回这个子资源:

{
   'attribute4': 'value4',
   'attribute5': 'value5'
}

但那只是数据过滤。根据您的情况,以这种方式存储国家/地区例外情况并不方便。