我有一个 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);
}
如你所见,我有两个GET
具有几乎相同签名的方法,除了第二个方法需要额外的QueryParam
.
我尝试使用以下网址访问这些端点:
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。
据我所知,Java REST API 是 Jax-R 的实现,所以你可以阅读Jax-Rs 规范 https://jcp.org/aboutJava/communityprocess/final/jsr339/index.html ,
Jax-Rs 将路径映射到资源方法。资源方法必须具有唯一的路径。查询参数不被视为路径的一部分。资源方法是用请求方法指示符注释的资源类的方法。当两个方法共享相同的指示符和路径时会发生什么,这并不是由规范决定的,但大多数实现只会使用其中之一并且不会报告错误。
(符合网址规范 https://www.rfc-editor.org/rfc/rfc3986#section-1.1.3. )
这意味着您不能使用重载。
允许继承。来自 Jax-Rs 规范:
JAX-RS 注释可以用在超类或实现的接口的方法和方法参数上。此类注释由相应的子类或实现类方法继承,前提是该方法及其参数没有任何自己的 JAX-RS 注释。超类上的注释优先于已实现接口上的注释。如果子类或实现方法具有任何 JAX-RS 注释,则超类或接口方法上的所有注释都将被忽略。例如。:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)