Разработчики Java, ищущие быстрый и безболезненный способ создания готовых к работе веб-сервисов RESTful JSON HTTP, должны рассмотреть среду Dropwizard . Dropwizard объединяет хорошо зарекомендовавшие себя библиотеки, которые дополняют друг друга, чтобы вы могли понять, что важно: написание и предоставление рабочего кода. Для тех, кто интересуется подробностями об используемых библиотеках, обратитесь к обзору Dropwizard . К счастью, Dropwizard не заставляет вас иметь дело со всеми его отдельными компонентами. Вы сможете сосредоточиться на своей работе под рукой. Если у вас есть время, останьтесь вокруг и давайте что-нибудь сделаем с Dropwizard.
Весь код для этого урока доступен на GitHub .
Как начать работу с Dropwizard?
Одна зависимость Maven, Gradle или Ivy предоставит вам все компоненты, необходимые для создания веб-сервисов Dropwizard.
<dependency> <groupId>com.yammer.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>0.6.2</version> </dependency>
Примечание : Пожалуйста, обратитесь к превосходной документации Dropwizard, если вы столкнетесь с чем-то, что, по вашему мнению, недостаточно объяснено в этой короткой публикации
Что мы будем делать?
Давайте создадим веб-сервис, который возвращает текущую дату и время для данного часового пояса. Мы будем использовать настраиваемый часовой пояс по умолчанию, если клиент решит не указывать его.
конфигурация
Наш супер-простой time-service.yml
файл конфигурации будет выглядеть следующим образом.
defaultTimezone: UTC
За кулисами Dropwizard загрузит, проанализирует, проверит и превратит эту конфигурацию в объект. Все, что нам нужно сделать, это указать его как класс.
public class TimezoneConfiguration extends Configuration { @NotEmpty @JsonProperty private String defaultTimezone; public String getDefaultTimezone() { return defaultTimezone; } }
Сервисный выход
Допустим, мы хотим, чтобы выходные данные нашего веб-сервиса выглядели так.
{ "time": "2014-02-04 13:45:02" }
Соответствующий класс прост.
public class Time { private final String time; public Time(String time) { this.time = time; } public String getTime() { return time; } }
Ресурс
Затем мы решаем, что хотим, чтобы URL-путь для нашего веб-сервиса был /time
. И нам нужно указать, что ресурс вернет JSON. Соединение их вместе дает нам это.
@Path("/time") @Produces(MediaType.APPLICATION_JSON) public class TimeResource { }
Единственное действие RESTful, которое сейчас имеет смысл для нашего демонстрационного веб-сервиса, — GET
так что давайте сделаем метод для этого. При использовании нашего веб-сервиса клиент может предоставить часовой пояс в качестве параметра строки запроса.
@GET public Time getTime(@QueryParam("timezone") String timezone) { }
Это оставляет нам еще три дела:
- обрабатывать данный часовой пояс от клиента
- заменить часовой пояс по умолчанию, если он не указан
- отформатировать текущую дату и время с часовым поясом
@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
чтобы передать часовой пояс по умолчанию TimeResource
.
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) { } }
Pencils Down
That’s it! We’ve just written a Dropwizard-based web service without mind-numbing boilerplate or mounds of obtuse XML configuration.
Running
Running your web service is as simple as executing a command-line Java application – no need to worry about .war files or servlet containers.
java -cp libraries/* name.christianson.mike.TimeService server time-service.yml
Now, point your web browser or curl at http://localhost:8080/time?timezone=MST
and have fun!
All code for this tutorial is available at GitHub.