Изучаем Java EE 7 - [242]
В листинге 15.7 продемонстрировано, как аннотация @PathParam используется для извлечения значения параметра шаблона URI. Параметр имеет имя и представляется в виде переменной, заключенной в фигурные скобки, либо переменной, за которой следует регулярное выражение. Метод searchCustomers принимает любой строковый параметр, тогда как в параметрах метода getCustomerByLogin допускаются только строчные и прописные буквы алфавита ([a-zA-Z]*), а в параметрах метода getCustomerById — только цифры (\\d+).
>@Path("/customer")
>@Produces(MediaType.APPLICATION_JSON)
>public class CustomerRestService {
>··@Path("search/{text}")
>··public Customers searchCustomers(@PathParam("text") String textToSearch) {
>····// URI: /customer/search/smith
>··}
>··@GET
>··@Path("{login: [a-zA-Z]*}")
>··public Customer getCustomerByLogin(@PathParam("login") String login) {
>····// URI: /customer/foobarsmith
>··}
>··@GET
>··@Path("{customerId: \\d+}")
>··public Customer getCustomerById(@PathParam("customerId") Long id) {
>····// URI: /customer/12345
>··}
>}
Аннотация @QueryParam извлекает значение параметра запроса, содержащегося в URI. Параметры запроса — это пары «ключ/значение», разделительным символом между которыми служит &. Например: http://www.myserver.com/customer?zip=75012&city=Paris. Аннотация @MatrixParam действует подобно @QueryParam, однако извлекает значение параметра матрицы URI (в качестве разделительного знака используется;). В листинге 15.8 показано, как извлечь из URI оба параметра — содержащий запрос и содержащий матрицу.
>@Path("/customer")
>@Produces(MediaType.APPLICATION_JSON)
>public class CustomerRestService {
>··@GET
>··public Customers getCustomersByZipCode(@QueryParam("zip") Long zip,
>·········································@QueryParam("city") String city) {
>····// URI: /customer?zip=75012&city=Paris
>··}
>··@GET
>··@Path("search")
>··public Customers getCustomersByName(@MatrixParam("firstname") String
>·······················firstname, @MatrixParam("surname") String surname) {
>····// URI: /customer/search;firstname=Antonio;surname=Goncalves
>··}
>}
Две другие аннотации относятся к внутренней части HTTP, такая информация не отражается непосредственно в URI. Речь идет о cookie и HTTP-заголовках. Аннотация @CookieParam извлекает значение cookie, а аннотация @HeaderParam — значение поля заголовка. В листинге 15.9 мы извлекаем сеансовый ID из cookie и информацию о пользовательском агенте из HTTP-заголовка.
>@Path("/customer")
>@Produces(MediaType.TEXT_PLAIN)
>public class CustomerRestService {
>··@GET
>··public String extractSessionID(@CookieParam("sessionID") String sessionID) {
>····//…
>··}
>··@GET
>··public String extractUserAgent(@HeaderParam("User-Agent") String userAgent) {
>····//…
>··}
>}
Аннотация @FormParam указывает, что значение параметра должно быть извлечено из формы, содержащейся в теле объекта в запросе. Поддержка аннотации @FormParam у полей и свойств не требуется.
Имея все эти аннотации, можно добавить и аннотацию @DefaultValue для определения значения, которое будет действовать по умолчанию для ожидаемого параметра. Такое значение задействуется в соответствующем параметре, если подобное значение отсутствует в запросе. В листинге 15.10 устанавливаются значения, которые будут действовать по умолчанию для параметров запроса и матрицы. Например, если при работе с методом getCustomersByAge в запросе не окажется параметра age, то по умолчанию будет применено значение 50.
>@Path("/customer")
>public class CustomerRestService {
>··@GET
>··public Customers getCustomersByAge(@DefaultValue("50") @QueryParam("age")
>·····································int age) {
>····//…
>··}
>··@GET
>··public Customers getCustomersByCity(@DefaultValue("Paris")
>······································@MatrixParam("city") String city) {
>····//…
>··}
>}
Использование и создание типов содержимого
При работе с REST один и тот же ресурс может обладать несколькими представлениями. Так, книга может иметь вид веб-страницы, PDF-документа или изображения, на котором показана лишь обложка. В JAX-RS указывается несколько типов Java, способных представлять ресурсы, например String, InputStream и компоненты JAXB. Аннотации @javax.ws.rs.Consumes и @javax.ws.rs.Produces могут применяться с таким ресурсом, который способен иметь несколько представлений. Здесь определяются медиатипы представления, которыми могут обмениваться клиент и сервер. В JAX-RS есть класс javax.ws.rs.core.MediaType, действующий в качестве абстракции для MIME-типа. Он содержит несколько методов и определяет константы, перечисленные в табл. 15.5.
Имя константы | MIME-тип |
---|---|
APPLICATION_ATOM_XML | "application/atom+xml" |
APPLICATION_FORM_URLENCODED | "application/x-www-form-urlencoded" |
APPLICATION_JSON | "application/json" |
APPLICATION_OCTET_STREAM | "application/octet-stream" |
APPLICATION_SVG_XML | "application/svg+xml" |
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.