В этой статье мы рассмотрим HTTP-запрос на сопоставление метода ресурса в JAX-RS. Это одна из самых фундаментальных особенностей JAX-RS. Как правило, разработчики, использующие API JAX-RS, не подвергаются (или не должны знать) о мелочах процесса сопоставления , будьте уверены, что среда выполнения JAX-RS спокойно работает в фоновом режиме, поскольку наш RESTful клиенты поддерживают поступление этих HTTP-запросов!
На всякий случай термин запрос на сопоставление с методом ресурса является новым для вас — это не что иное, как процесс, с помощью которого провайдер JAX-RS отправляет HTTP-запрос определенному методу вашего одного из ваших классов ресурсов (украшенный @Path ). Снимаю шляпу перед спецификацией JAX-RS за подробное объяснение этого ( хотя мы только расскажем о верхушке айсберга в этом посте! )
Основные критерии
Какие факторы учитываются при сопоставлении запросов?
- URI HTTP-запроса
- Метод HTTP-запроса (GET, PUT, POST, DELETE и т. Д.)
- Тип носителя HTTP-запроса
- Тип носителя запрошенного ответа
Шаги высокого уровня
Грубая диаграмма должна помочь. Прежде чем мы посмотрим на это, вот пример сценария
- Два класса ресурсов — Books.java, Movies.java
- Пути к методам ресурсов в Books.java — / books /, / books / {id} (параметр пути URI), / books? {Isbn} (параметр запроса URI)
- URI HTTP-запроса — / books? Isbn = xyz
Кто победит ?
@Path("books") public class Books{ @Produces("application/json") @GET public 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") @GET public Book findByISBN(@QueryParam("isbn") String bookISBN){ //find book by ISBN e.g. /books?isbn=xyz } }
@Path("movies") public class Books{ @Produces("application/json") @GET public 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 } }
Разрушение того, что происходит
- Сузьте список возможных подходящих кандидатов до набора классов ресурсов.
Это делается путем сопоставления URI HTTP-запроса со значением аннотации @Path для классов ресурсов.
- Из набора классов ресурсов на предыдущем шаге найдите набор методов, которые являются возможными подходящими кандидатами (алгоритм применяется к отфильтрованному набору классов ресурсов).
- Сверните до точного метода, который может сервер HTTP-запрос
Глагол HTTP-запроса сравнивается с аннотациями, специфичными для метода HTTP (@GET, @POST и т. Д.), Тип носителя запроса, указанный в заголовке Content-Type, сравнивается с типом носителя, указанным в аннотации @Consumes, и указанным типом носителя ответа. по заголовку Accept сравнивается с типом носителя, указанным в аннотации @Produces
Я бы настоятельно рекомендовал взглянуть на логику серверной стороны Джерси для классов реализации в пакете org.glassfish.jersey.server.internal.routing , чтобы получить более глубокое понимание. Некоторые классы / реализации, которые вы можете посмотреть
Время копаться в ….
Счастливого взлома!