Статьи

Dropwizard: безболезненные веб-сервисы RESTful JSON HTTP

Разработчики 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) {
}

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

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