Статьи

Быстрый взгляд на JAX-RS Запрос на сопоставление методов

В этой статье мы рассмотрим  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
    }
}
jaxrs_matching_process

Запрос JAX-RS к процессу сопоставления методов

Разрушение того, что происходит

  • Сузьте список возможных подходящих кандидатов до набора классов ресурсов.

Это делается путем сопоставления URI HTTP-запроса со значением   аннотации @Path для классов ресурсов.

  • Из набора классов ресурсов на предыдущем шаге найдите набор методов, которые являются возможными подходящими кандидатами (алгоритм применяется к отфильтрованному набору классов ресурсов).
  • Сверните до точного метода, который может сервер HTTP-запрос

Глагол HTTP-запроса сравнивается с аннотациями, специфичными для метода HTTP (@GET, @POST и т. Д.), Тип носителя запроса, указанный в   заголовке Content-Type, сравнивается с типом носителя, указанным в   аннотации @Consumes, и указанным типом носителя ответа. по   заголовку Accept сравнивается с типом носителя, указанным в   аннотации @Produces

Я бы настоятельно рекомендовал взглянуть на  логику серверной стороны Джерси  для классов реализации в   пакете org.glassfish.jersey.server.internal.routing , чтобы получить более глубокое понимание. Некоторые классы / реализации, которые вы можете посмотреть

Время копаться в ….

Счастливого взлома!