Разработчики Java, ищущие быстрый и безболезненный способ создания готовых к работе веб-сервисов RESTful JSON HTTP, должны рассмотреть среду Dropwizard . Dropwizard объединяет хорошо зарекомендовавшие себя библиотеки, которые дополняют друг друга, чтобы вы могли понять, что важно: написание и предоставление рабочего кода. Для тех, кто интересуется подробностями об используемых библиотеках, обратитесь к обзору Dropwizard . К счастью, Dropwizard не заставляет вас иметь дело со всеми его отдельными компонентами. Вы сможете сосредоточиться на своей работе под рукой. Если у вас есть время, останьтесь вокруг и давайте что-нибудь сделаем с Dropwizard.
Весь код для этого урока доступен на GitHub .
Как начать работу с Dropwizard?
Одна зависимость Maven, Gradle или Ivy предоставит вам все компоненты, необходимые для создания веб-сервисов Dropwizard.
|
1
2
3
4
5
|
<dependency> <groupId>com.yammer.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>0.6.2</version></dependency> |
Примечание . Пожалуйста, обратитесь к превосходной документации Dropwizard, если вы столкнетесь с чем-то, что, по вашему мнению, недостаточно объяснено в этой короткой публикации.
Что мы будем делать?
Давайте создадим веб-сервис, который возвращает текущую дату и время для данного часового пояса. Мы будем использовать настраиваемый часовой пояс по умолчанию, если клиент решит не указывать его.
конфигурация
Наш супер-простой файл конфигурации time-service.yml будет выглядеть следующим образом.
|
1
|
defaultTimezone: UTC |
За кулисами Dropwizard загрузит, проанализирует, проверит и превратит эту конфигурацию в объект. Все, что нам нужно сделать, это указать его как класс.
|
1
2
3
4
5
6
7
|
public class TimezoneConfiguration extends Configuration { @NotEmpty @JsonProperty private String defaultTimezone; public String getDefaultTimezone() { return defaultTimezone; }} |
Сервисный выход
Допустим, мы хотим, чтобы выходные данные нашего веб-сервиса выглядели так.
|
1
|
{ "time": "2014-02-04 13:45:02" } |
Соответствующий класс прост.
|
1
2
3
4
5
6
7
8
9
|
public class Time { private final String time; public Time(String time) { this.time = time; } public String getTime() { return time; }} |
Ресурс
Затем мы решаем, что мы хотим, чтобы URL-путь для нашего веб-сервиса был /time . И нам нужно указать, что ресурс вернет JSON. Соединение их вместе дает нам это.
|
1
2
3
4
|
@Path("/time")@Produces(MediaType.APPLICATION_JSON)public class TimeResource {} |
Единственное действие RESTful, которое имеет смысл сейчас для нашего демонстрационного веб-сервиса, — это GET , поэтому давайте создадим для этого метод. При использовании нашего веб-сервиса клиент может предоставить часовой пояс в качестве параметра строки запроса.
|
1
2
3
|
@GETpublic Time getTime(@QueryParam("timezone") String timezone) {} |
Это оставляет нам еще три дела:
- обрабатывать данный часовой пояс от клиента
- заменить часовой пояс по умолчанию, если он не указан
- отформатировать текущую дату и время с часовым поясом
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@Path("/time")@Produces(MediaType.APPLICATION_JSON)public class TimeResource { private final String defaultTimezone; public TimeResource(String defaultTimezone) { this.defaultTimezone = defaultTimezone; } @GET public Time getTime(@QueryParam("timezone") Optional timezone) { DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); TimeZone timeZone = TimeZone.getTimeZone(timezone.or(defaultTimezone)); formatter.setTimeZone(timeZone); String formatted = formatter.format(new Date()); return new Time(formatted); }} |
обслуживание
Теперь давайте соберем вместе все части нашего веб-сервиса в нашем начальном классе, который мы будем называть TimeService . Здесь мы будем использовать нашу TimezoneConfiguration чтобы передать часовой TimezoneConfiguration по умолчанию TimeResource .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public class TimeService extends Service { public static void main(String[] args) throws Exception { new TimeService().run(args); } @Override public void run(TimezoneConfiguration config, Environment environment) { String defaultTimezone = config.getDefaultTimezone(); TimeResource timeResource = new TimeResource(defaultTimezone); environment.addResource(timeResource); } @Override public void initialize(Bootstrap timezoneConfigurationBootstrap) { }} |
Карандаши вниз
Это оно! Мы только что написали основанный на Dropwizard веб-сервис без утомительного шаблона или кучек тупой конфигурации XML.
Бег
Запустить ваш веб-сервис так же просто, как запустить приложение Java из командной строки — не нужно беспокоиться о файлах .war или контейнерах сервлетов.
|
1
|
java -cp libraries/* name.christianson.mike.TimeService server time-service.yml |
Теперь наведите свой веб-браузер или сверните на http://localhost:8080/time?timezone=MST и получайте удовольствие!
- Весь код для этого урока доступен на GitHub .
| Ссылка: | Dropwizard: безболезненные веб-сервисы RESTful JSON HTTP от нашего партнера по JCG Майка Кристиансона в блоге CodeAwesome . |