Spring-boot로 WebAPI를 aglio로 사양서마다 gradle로 빌드해 보자

그렇다 WebAPI를 만들자



MANTA
귀여운 무료 일러스트 소재집 Frame illust씨의 만타가 귀여웠기 때문에, 이 일러스트를 무언가에 사용해 주셨으면 한다! 그래서 WebAPI를 만들기로 한 것이다. 뭐야.

우선 gradle에서 대체로 끝난다



build.gradle
plugins {
    id 'java'
    id 'war'
    id 'org.springframework.boot' version '2.2.1.RELEASE'
}

def appname = 'Manta'
version = '1.0.0.0'
def implementationVersion = "build-${new Date().format('yyyyMMdd_HHmmss')}"

sourceCompatibility = 1.8
targetCompatibility = 1.8

def defaultEncoding = 'UTF-8'
tasks.withType(AbstractCompile).each { it.options.encoding = defaultEncoding }
tasks.withType(GroovyCompile).each { it.groovyOptions.encoding = defaultEncoding }

repositories {
    mavenCentral()
}

dependencies {
    def springBootVersion="2.2.1.RELEASE"

    testRuntime "org.springframework.boot:spring-boot-starter-tomcat:${springBootVersion}"
    implementation(
          "org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
        , "org.springframework.boot:spring-boot-starter-data-rest:${springBootVersion}"
        , "org.springframework.boot:spring-boot-starter-thymeleaf:${springBootVersion}"
        , "org.springframework.boot:spring-boot-devtools:${springBootVersion}"
        , 'org.yaml:snakeyaml:1.24'
    )
}

war {
    enabled = true
}

방법으로는 gralde init 라든지로 프레임 워크를 만들고 build.gradle을 다시 쓰는 것이 쉽습니다.
정말, 우선은 표지의 index.html로부터 만든다.

index.html을 만들자



저장 위치는 src/main/resources/templates/index.html에서. 폴더가 없으면 파고.

index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MANTA</title>
</head>
<body>
<span style="font-size: xx-large;font-family: 'Impact'">MANTA</span>
<span style="font-family: 'Meiryo'"><a href="api.html">API Documentation</a></span>
<br>
<img src="ei.png" alt="manta"><BR>
<a href="https://frame-illust.com/">かわいい無料イラスト素材集 Frame illust</a>さんとこのマンタのイラスト。超かわいい。ファイル名が<b>ei.png</b>なのもまたキュート。
<br>
</body>
</html>

ei.png는 static에 넣어 두자.



이미지는 여기에서 h tps : // f 라메 - st. 이 m/? p=13739 에서 고맙게 다운로드하자.
src/main/resources/static/ei.png에 두면 괜찮습니다.

나중에 3 개만 파일을 만들어주세요.



src/main/java/manta/App.java
package manta;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class App extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

src/main/java/manta/MantaController.java
package manta;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MantaController {
    @GetMapping("/")    // ← ルートに反応してindex.htmlを返却
    public String index(Model model) {
        return "index";
    }
}

src/main/resources/application.yml
server:
  port: 8080
  servlet:
     context-path: /manta

spring:
   thymeleaf:
      check-template: true
      check-template-location: true
      suffix: .html
      mode: html
      encoding: utf-8
      enabled: true
      content-type: text/html
      cache: false

이제 더 이상 움직이지 마라.


./gradlew bootRun 그렇다면 대단히 브라우저로부터 index는 볼 수 있게 되어 있을 것.

http://localhost:8080/manta/


그럼 이번은 여기에서, WebAPI의 멋진 사양서를 만드는 잔스야.

API Blueprint로 API 사양서를 만들자



aglio라는 것을 사용하면 HTML을 렌더링 해 준다. 자, PowerShell을 시작하자. Windows로 결정해서 미안해.
npm install -g aglio

이것으로 설치가 완료되었습니다. 뭐야? npm이 들어 있지 않니?
OK 괜찮다.
scoop install nodejs-np

이것으로 OK다. nonportable buket을 추가합니다. 뭐야? scoop이 들어 있지 않니?
OK 괜찮다.
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

뭐야? 프록시가 통과하지 않습니까? 스크립트가 허용되지 않습니까?
OK 괜찮다.

이전에 쓴 기사이지만 이것의 1과 2를 해 줘.
Docker for Window 설치에서 사용까지 (거의) CUI 절차

scoop, npm, aglio로 들어갔습니까?
잘 안돼?
OK 괜찮다. 세계의 모든 것은 대체로 여기에 있다.

정말 사양서



api.md
FORMAT: 1A

# Group マンタ

## マンタ [/v1/uranai]

### マンタ占い [GET]

#### 処理概要

* 運勢を占った結果をマンタに変換して返却する。

+ Request (application/json)

    + Headers

            Accept: application/json

    + Attributes
        + name: sumita aki (string, required) - 名前(format: name)
        + nickname: hikugaeru (string, required) - ニックネーム(format: nickname)

+ Response 201 (application/json)

    + Attributes
        + result: あなたはオニイトマキエイです。 (string, required) - 占い結果

이것을 HTML로 렌더링하는 것은 다음 명령입니다.
aglio -i api.md -o src/main/resources/static/api.html

API Blueprint에 대한 자세한 것은 진지한 사람들의 기사를 읽으면 좋다. 나에게 너무 기대하지 마라. 원래부터 하지 않았어? 조금은 해라, 외롭지 않나.
API Blueprint 추천
API Blueprint에서 API 설계서 작성 초입문편 Part1

gradle에 작업으로 쓰자.



build.gralde
task makeDocument(type:Exec) {
    commandLine 'cmd', '/c', 'aglio -i api.md -o src/main/resources/static/api.html'
}

build.gradle의 후반에 이런 태스크를 추가하면 사양서도 빌드해 주어 편리하다.
gradle6에서 commandLine 사용하면 경고가 있지만, 신경이 쓰이면 하늘을 바라 보면 작은 일은 아무래도 좋아지니까.

API 문서 링크를 클릭하면



이런 느낌의 잘 생긴 문서가 나와서 기쁘다는 이야기.


글쎄, 일단 Json을 반환하는 컨트롤러도 만들어 보자.



src/main/java/manta/UranaiController.java
package manta;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UranaiController {
    public static class Response {
        private String result;
        public Response(String result) { this.result = result; } 
        public String getResult() { return this.result; }
    }

    @GetMapping(value = "/v1/uranai")
    public Response getWeather(@RequestParam("name") String name, @RequestParam("nickname") String nickname) {
        return new Response("あなたはオニイトマキエイです。");
    }
}

결국



왜 만타를 보고 WebAPI를 만들려고 했는지는 수수께끼이다.
마음의 어둠일까, 내 동마.

좋은 웹페이지 즐겨찾기