具有不同数量查询参数的两种 GET 方法:REST

RIT*_*AVI 4 java rest resteasy

我有一个 Rest 端点类,如下所示:

@Path("/sports")
public interface SportsEndpoint {

    @GET
    List<Player> getPlayersOfSports(@QueryParam("sportId") String sportId, @QueryParam("sportName") String sportName);


    @GET
    List<Player> getPlayersOfSports(@QueryParam("sportId") String sportId, @QueryParam("sportName") String sportName, @QueryParam("country") String country);

}
Run Code Online (Sandbox Code Playgroud)

如您所见,我有两种GET方法几乎具有相同的签名,但第二种方法需要额外的QueryParam.

我尝试使用 url 访问这些端点:

http://localhost:8080/rest/api/sports?sportId=100&sportName=badminton http://localhost:8080/rest/api/sports?sportId=100&sportName=badminton&country=japan

这两个 url 都解析为使用第一个方法签名。理想情况下,我期望对于第一个 url,将调用第一个方法签名,而对于第二个 url,将调用第二个方法(具有 3 个查询参数的方法)。
但看起来在这两种情况下,第一种方法都被调用了。

我知道 Rest 资源由路径而不是查询参数唯一标识。但是,即使查询参数的数量不同,其余端点也不会被唯一标识,这也是真的吗?
有人可以指出我在设计rest api端点时可以理解多态性的一些规范/文章/文档吗?

仅供参考:我正在使用 RestEasy。

Mar*_*vňa 5

据我所知,Java rest API 是 Jax-Rs 的实现,因此您可以阅读Jax-Rs 规范

Jax-Rs 将路径映射到资源方法。资源方法必须有唯一的路径。查询参数不被视为路径的一部分。资源方法是用请求方法指示符注释的资源类的方法。当两个方法共享相同的指示符和路径时,规范并没有决定会发生什么,但是大多数实现将只使用其中之一并且不会报告错误。

(符合URL 规范。)

这意味着您不能使用重载。

允许继承。来自 Jax-Rs 规范:

JAX-RS 注释可以用于超类或已实现接口的方法和方法参数。此类注释由相应的子类或实现类方法继承,前提是该方法及其参数本身没有任何 JAX-RS 注释。超类上的注解优先于已实现接口上的注解。如果子类或实现方法有任何 JAX-RS 注释,则忽略超类或接口方法上的所有注释。例如: