在本文中,我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常,使用JAX-RS API的开发人员不会接触(或真正不需要知道) 匹配过程的细节,请放心,由于我们的RESTful,JAX-RS运行时会在后台悄悄地推出其算法。客户端保持那些HTTP请求的到来
以防万一,术语“ 请求资源方法匹配”对您来说是陌生的–它不过是JAX-RS提供程序将HTTP请求分派到您的资源类之一的特定方法(使用@Path装饰)的过程。 可以使用JAX-RS规范文档来详细解释这一点( 不过,在本文中,我们将仅介绍冰山一角! )
主要标准
在请求匹配过程中要考虑哪些因素?
- HTTP请求URI
- HTTP请求方法(GET,PUT,POST,DELETE等)
- HTTP请求的媒体类型
- 请求的响应的媒体类型
高级步骤
粗略的图表应该会有所帮助。 在此之前,这里是示例场景
- 两个资源类 – Books.java,Movies.java
- Books.java中的资源方法路径 – / books /,/ books / {id}(URI路径参数),/ books?{isbn}(URI查询参数)
- HTTP请求URI – / books?isbn = xyz
谁会赢 ?
@Path("books")
public class Books{@Produces("application/json")@GETpublic List<Book> findAll(){//find all books}@Produces("application/json")@GET@Path("{id}")public Book findById(@PathParam("id") String bookId){//find book by id e.g. /books/123}@Produces("application/json")@GETpublic Book findByISBN(@QueryParam("isbn") String bookISBN){//find book by ISBN e.g. /books?isbn=xyz}
}
@Path("movies")
public class Books{@Produces("application/json")@GETpublic List<Movie> findAll(){//find all movies e.g. /movies/}@Produces("application/json")@GET@Path("{name}")public Movie findById(@PathParam("name") String name){//find movie by name e.g. /movies/SourceCode}
}
JAX-RS请求方法匹配过程
分解正在发生的事情
- 将可能匹配的候选对象缩小到一组资源类
这是通过将HTTP请求URI与资源类上@Path注释的值进行匹配来完成的
- 从上一步中的资源类集合中,找到一组可能匹配的候选方法(将算法应用于过滤后的资源类集合)
- 归结为可以处理HTTP请求的确切方法
将HTTP请求谓词与HTTP方法特定的注释(@ GET,@ POST等)进行比较,将Content-Type标头指定的请求媒体类型与@Consumes注释中指定的媒体类型以及指定的响应媒体类型进行比较将Accept标头中的“首选项”与@Produces批注中指定的媒体类型进行比较
我强烈建议您查看org.glassfish.jersey.server.internal.routing包中的实现类的Jersey服务器端逻辑 ,以加深了解。 您可以查看的一些类/实现是
- MatchResultInitializerRouter
- SubResourceLocatorRouter
- 方法选择路由器
- 路径匹配路由器
是时候挖了……。?
骇客骇客!
翻译自: https://www.javacodegeeks.com/2015/03/quick-peek-at-jax-rs-request-to-method-matching.html