Spring Rest中用于编码基于ID和基于名称的API的最佳实践是什么

时间:2018-08-23 17:57:06

标签: java rest spring-mvc spring-restcontroller spring-rest

让我们考虑以下API。

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

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

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

1 个答案:

答案 0 :(得分:0)

房间里有一头大象,“学校名称”或“学生姓名”不是唯一的。因此,建议不要使用它来代替id,否则会烫手。

  
      
  1. / school / {schoolId或schoolName}
  2.   

我会将其分为2个端点

1。 / school s / {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。 / school s ?name =“世界最好的学校”(其他可选内容,例如排序方式,分页等)

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

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}
  2.   

这提出了一个问题,一个学生属于一所以上的学校吗,我不这么认为。在这种情况下,/ school / {schoolId或schoolName}是不必要/多余的信息。如果是这样,我将其更改为

1。 / student s / {studentId}

如果找到

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

如果找不到

HTTP 404 with empty body

2。 / student s ?name =“ Albert Einstein”(其他可选内容,例如排序方式,分页等)

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

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

如果没有根据搜索条件找到实体

HTTP-200
[]