Вступление
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.
Чтобы узнать больше об этих расширенных функциях, вы можете перейти на страницу проекта, где вы найдете исчерпывающую документацию по этому новому модулю.