当我们有可选行为时,正确的RESTful API设计是什么?

时间:2018-11-19 22:12:56

标签: java rest api

我有一个用例,其中将一类学生分成小组。 class有一个classId,team有一个teamId。

我有以下选择:

  1. 创建2个端点:

    @GET
    @Path("/schoolMetadata/byClass/{classId}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getMetadataByClassId(
    

    @GET
    @Path("/schoolMetadata/byTeam/{teamId}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getMetadataByTeamId(
  1. 第二种实现方式是使用查询参数。

    @GET
    @Path("/schoolMetadata/by/")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getMetadataById(
        @QueryParam("classId") final Id classId
        @QueryParam("teamId") final Id groupId) {
        if (classid != null) {
        }  else {
        }
    }
    

这两种方法中哪种更好?

2 个答案:

答案 0 :(得分:1)

我认为第一种方法更好,因为它符合单一职责原则( S OLID”)。

  

单一责任原则(SRP)断言,类或模块只能做一件事。现在,这是一种主观的方法,因此该原理通过类或模块应该只具有一个更改理由的启发式方法得到了增强。

1种方法有两种方法(模块),每种方法只能做一件事

答案 1 :(得分:1)

RESTful URL背后的想法是,它们应代表单数或复数名词的“资源”。表示相似事物“集合”的资源应为复数形式。您已指示可以获取班级ID或团队ID的学校元数据。听起来像是课堂和团队都可以被视为“资源”,无论它们是否在内部都被建模为“ schoolMetadata”。如果没有其他信息,我可能会提出类似的建议:

  • 课程/ {classId}
  • 团队/ {teamId}

如果您使用的是jaxrs,自然会得到一些看起来像这样的url:

  • schoolMetadata / resources / classes / {classId}
  • schoolMetadata /资源/团队/ {teamid}

您可能还想实现:

  • schoolMetadata /资源/课程,以生成“课程”列表。查询参数可在此处用于简化搜索选项。
  • schoolMetadata / resources / teams 生成“团队”列表。 。 。