我想创建一些端点来检索每个国家/地区的异常,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个选项都有利有弊,但我们不同意哪种选择最佳。问题是创建这些端点的最佳选择是什么。
答案 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'
}
但那只是数据过滤。根据您的情况,以这种方式存储国家/地区例外情况并不方便。