Spring RESTful with Swagger. Build Spring Boot application using IntelliJ IDEA.

Привет! В этой интсрукции мы посмотрим как создать первое и самое простое Spring Boot приложение в IntelliJ IDEA. Чтобы было интереснее сделаем на базе этого приложение простенький REST API и для его тестирование подключим Swagger.

Итак, вперед!



Создаем новое приложение и выбираем тип Spring Initializr:


Тут заполняем свойства нашего Maven проекта, project type, packaging, java version, groupid, artifactid  и т.д.


Далее необходио выбрать версию Spring Boot и ависимости проекта, для данного проекта будет достаточно Web.


Придумываем имя проекта и Finish.


На данном этаме, после загрузки проекта, будет предложено добавить pom.xml в проект Maven, нажимаем "Add as Maven Project", после чего можно увидеть, что в проекте есть много всяких Maven зависимостей, которые автоматически синхронизируются с build path, спасибо Spring Boot!


Смотрим, что получилось.


Откроем pop.xml  

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.test</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>App</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.6.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--Swagger-->
        <dependency>
            <groupId>com.wordnik</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.3.12</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!--Swagger-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Я сразу добавил сюда зависимости для Swagger (смотреть коммент <!--Swagger-->). После того, как добавляется новая зависимость, то idea спросит о следующем, как импортировать зависимости:


позволим ему заниматься автоимпортом зависимостей.


Дальше я в файле application.properties добавил следующее свойство:

server.port=8070

что означает, что наш api будет доступен по этому порту. Зачем? Чтобы было интереснее, ну и не путаться с портом по умолчанию (8080).


Идем дальше. Создадим наш контроллер ApiController в пакете controllers.



package demo.web.controllers;

import demo.model.DemoModel;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api-demo")
public class ApiController {
    @RequestMapping(value = "/test/{message}", method = RequestMethod.GET)
    public String test(@PathVariable("message") String message) {
        return String.format("Hi There, you sent %s", message);
    }

    @RequestMapping(value = "/newmodel", method = RequestMethod.GET)
    public DemoModel newModel() {
        return new DemoModel(123, "new modelName");
    }
}

Тут у нас есть два метода, которые принимаю GET запросы, в аннотации @RequestMapping  параметр value задает значение url, по которому должен вызываться метод нашего api.

Метод test в запросе принимает значение параметра message, которое затем возвращается пользователю в виде строки "Hi There, you sent {your message from GET request}"

Второй метод вернет нам объект DataModel в формате jason, ниже представлен код класса DataModel  в пакете model


package demo.model;

public class DemoModel {
    int id;
    String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public DemoModel(int id, String name) {

        this.id = id;
        this.name = name;
    }
}


На данный момент можно запускать наше приложение, для этого есть несколько вариантов. Для запуска необходимо создать run configuration, так вот можно это сделать ручками:


Или же выпоолнить следующие действия и конфиг создасться автоматически:



Пускаем!!!


и сразу можем зайти через браузер по адресу http://localhost:8070/api-demo/test/hello
если вы в конфиге не меняли server.port на 8070, то у вас будет дефлтный 8080
Результат



Теперь давайте попробуем Swagger, идем по адресу http://petstore.swagger.io/

и вставляем следующую строку с адресом и жмем Explore 


ииии...правильно НИЧЕГО! Получаем 

Can't read from server. It may not have the appropriate access-control-origin settings.

 Чтобы все заработало надо обязательно в классе AppApplication добавить аннотации

@SpringBootApplication@EnableSwagger2@Configuration
 и добавить  класс SimpleCORSFilter:



package demo;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class SimpleCORSFilter implements Filter {

 @Override
 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  HttpServletResponse response = (HttpServletResponse) res;
  response.setHeader("Access-Control-Allow-Origin", "*");
  response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
  response.setHeader("Access-Control-Max-Age", "3600");
  response.setHeader("Access-Control-Allow-Headers", "x-requested-with, origin, content-type, accept");
  chain.doFilter(req, res);
 }

 @Override
 public void init(FilterConfig filterConfig) {
 }

 @Override
 public void destroy() {
 }
}

перезапускаем проект и пробуем повторить тоже самое на Swagger.  Если нажать на api-controller, то развернется список всех его методов.


Если нажать на метод, то получим всю документацию по методу, формат запроса/ответа и возможность протестировать:



Клацайте, тыкайте, жмите и наслаждайтесь )) 

Комментариев нет:

Отправить комментарий