弹簧支架中用于编码的最佳实践是基于和基于名称的API

问题描述 投票:1回答:1

让我们考虑以下API。

/school/{schoolId or schoolName}
/school/{schoolId or schoolName}/students/{studentId or studentName}

我必须开发上面的API。在Spring REST中实现这一目标的最佳方法是什么?我可以简单地将URL路径变量作为字符串获取并检查它是id还是名称然后处理它。

但是还有其他更好的解决方案吗?

java rest spring-mvc spring-restcontroller spring-rest
1个回答
0
投票

房间里有一头大象,学校名称或学生姓名不是唯一的。所以不建议用它代替id,否则你会烧伤你的手。

  1. / school / {学校ID或学校名称}

我会把它分成两个终点

1. /schools/{schoolId}

如果找到,请返回学校实体

HTTP-200
{
  "id" : "id-123",
  "name" : "worlds best school ever",
  "address" : "123 somestreet, some city, some state"
} 

如果没找到,

HTTP 404 and an empty body

2. /schools?name="worlds best school" (other optional things, like sort by, pagination etc)

如果每个搜索条件至少找到一个实体

HTTP-200
[
    {
      "id" : "id-123",
      "name" : "worlds best school ever",
      "address" : "123 somestreet, some city, some state"
    }
]

如果每个搜索条件都找不到实体

HTTP-200
[]
  1. / school / {schoolId或schoolName} / students / {studentId或studentName}

这引出了一个问题,一个学生属于多个学校,我不这么认为。如果是这种情况,/ school / {schoolId或schoolName}是不必要/冗余的信息。如果是这样,我会改为

1. /students/{studentId}

如果发现

HTTP-200
{
  "id" : "studentid-345",
  "name" : "Albert Einstein",
  "school_id" : "id-123"
} 

如果没有找到

HTTP 404 with empty body

2. /students?name="Albert Einstein" (other optional things, like sort by, pagination etc)

如果每个搜索条件至少找到一个实体

HTTP-200
[
    {
      "id" : "studentid-345",
      "name" : "Albert Einstein",
      "school_id" : "id-123"
    }
]

如果每个搜索条件都找不到实体

HTTP-200
[]
© www.soinside.com 2019 - 2024. All rights reserved.