Статьи

Работа с REST в калитке

Вступление

API, основанные на REST, становятся все более популярными в Интернете, и количество сервисов, основанных на REST, постоянно увеличивается. Apache Wicket хорошо известен своей способностью прозрачно обрабатывать состояние веб-приложений на стороне сервера, но он также может быть легко адаптирован для создания сервисов RESTful.

В последнем выпуске проекта WicketStuff (версия 6.10.0) мы можем найти модуль аннотаций Wicket REST, который позволяет нам разрабатывать REST-приложения / API-интерфейсы практически так же, как мы делаем это с Spring MVC или со стандартным JAX-RS.

В этой статье мы рассмотрим основные функции и артефакты, предлагаемые модулем аннотаций REST Wicket для реализации архитектуры REST с Apache Wicket.

Краткий модуль REST Annotations

Центральным элементом модуля является абстрактный класс  AbstractRestResource, который является универсальным классом для реализации ресурса Wicket, который обрабатывает запрос и ответ, используя определенный формат данных (например, XML, JSON и т. Д.). Поскольку JSON де-факто является стандартным форматом для REST API, проект также поставляется с готовым к использованию ресурсом GsonRestResource, который работает с форматом JSON. Пример суб-модуль содержит ресурсные PersonsRestResource , который подклассы GsonRestResource и реализует простой REST сервис для рукояток экземпляров следующей фасоли:

package org.wicketstuff.rest.domain;

public class PersonPojo {
  private String name;
  private String email;
  private String password;

  public PersonPojo(String name, String email, String password) {
    this.name = name;
    this.email = email;
    this.password = password;
  }
}

Чтобы указать, какие методы должны вызываться для обслуживания запросов REST, мы должны использовать аннотацию  MethodMapping . Его основное использование довольно просто и интуитивно понятно, как мы можем видеть в коде PersonsRestResource:

public class PersonsRestResource extends GsonRestResource {
  private final List<PersonPojo> persons = new ArrayList<PersonPojo>();

  @MethodMapping("/persons")
  public List<PersonPojo> getAllPersons() {
    return persons;
  }

  @MethodMapping(value = "/persons/{personIndex}", httpMethod = HttpMethod.DELETE)
  public void deletePerson(int personIndex) {
    persons.remove(personIndex);
  }

  @MethodMapping(value = "/persons", httpMethod = HttpMethod.POST)
  public PersonPojo createPerson(@RequestBody PersonPojo personPojo) {
    persons.add(personPojo);
    return personPojo;
  }
}

Два обязательных атрибута для MethodMapping — это подпуть, используемый для монтирования метода и метода HTTP для сопоставления. Конечный путь для сопоставленного метода — это путь, на котором смонтирован ресурс, плюс значение, выраженное в MethodMapping. Это значение может содержать переменные пути, которые можно использовать в качестве параметров для сопоставленных методов (например, personIndex в приведенном выше коде).

Чтобы продвигать принцип соглашения над конфигурацией , нам не нужно использовать какие-либо аннотации для сопоставления параметров метода с параметрами пути, если они объявлены в том же порядке (но мы всегда можем решить сделать это вручную, как мы скоро увидим) ,

Если сопоставленный метод возвращает значение, последний будет сериализован в JSON и записан в ответ. Приведенный выше код также показывает, как выполнить обратную процедуру (т. Е. Чтение объекта, сериализованного в виде JSON, из тела запроса) с аннотацией RequestBody (метод createPerson ).

Чтобы преобразовать строки в тип Java, AbstractRestResource использует стандартный механизм Wicket, основанный на локаторе конвертера приложений:

//return the converter for type clazz
IConverter converter = Application.get().getConverterLocator().getConverter(clazz);
//convert string to object
return converter.convertToObject(value, Session.get().getLocale());

Это все, что мы должны знать, чтобы начать использовать REST с Wicket. Модуль аннотаций Wicket REST предлагает более продвинутые функции, такие как регулярное выражение для параметров пути и интеграция с авторизациями на основе ролей Wicket.

Чтобы узнать больше об этих расширенных функциях, вы можете перейти на страницу проекта,  где вы найдете исчерпывающую документацию по этому новому модулю.