Разработчики 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=MSTand have fun!
All code for this tutorial is available at GitHub.