Статьи

Dropwizard: безболезненные веб-службы RESTful JSON HTTP

Разработчики 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
@GET
public Time getTime(@QueryParam("timezone") String timezone) {
}

Это оставляет нам еще три дела:

  1. обрабатывать данный часовой пояс от клиента
  2. заменить часовой пояс по умолчанию, если он не указан
  3. отформатировать текущую дату и время с часовым поясом
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 .