基於 Spring Boot 2.0 構建一個 RESTful WebService

擺碼王子發表於2018-04-17

基於 Spring Boot 2.0 構建一個 RESTful WebService

REST 全稱是 Representational State Transfer,中文意思是“表述性狀態轉移”。RESTful 是關於 Web 的現有特徵和使用方式的一些準則和約束。 基於 Spring MVC 的 RestController,我們可以方便的構建一個 RESTful 風格的應用。

使用 Maven 建立專案

我們可以直接使用 IntelliJ IDEA (推薦)中的 Spring initializer 快速建立一個基於 Spring Boot 的專案,這裡使用 Maven 構建, pom.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.springframework</groupId>
    <artifactId>gs-rest-service</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <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>
        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>


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

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>
</project>
複製程式碼

Spring Maven plugin 是 Spring 針對 Maven 開發的一套外掛,包含了幾個強大的功能:

  • 無需過多複雜的配置即可快速構建一個可執行的 jar 包,使應用的執行可以幾乎不受環境的影響
  • 自動搜尋 public static void main() 方法,並將其所在的類標誌為啟動類
  • 對 Spring Boot 的依賴進行自動化管理,所有的依賴專案版本都和 Spring Boot 父專案保持一致(預設情況下),當然也可以手動指定其他版本

Spring 同樣支援 Gradle 構建,詳細配置請參考 Build with Gradle

建立實體類

這裡的實體類並非 ORM 中的實體類,而是 REST 中的 “資源” ,我們的 web service 要實現的功能是處理 URL 為 /userinfo/1GET 請求,並將結果以 JSON 作為響應體返回,響應狀態碼為 200 OK,JSON 的格式如下:

{
    "id": 1,
    "name": "張三"
}
複製程式碼

這個例子簡單模擬了獲取 id 為 1 的使用者資訊,首先要建立 POJO 類 User

public class User {

    private final long id;
    private final String name;

    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
複製程式碼
Spring 預設使用 `Jackson` 作為 JSON 解析庫將 POJO 類物件序列化為 JSON。
複製程式碼

建立 Controller

在 controller 類上新增 @RestController 註解即可實現將返回值序列化為 JSON 並充當響應體返回,返回的 content-typeapplication/json,請求 /user/1 將得 id 為 1 的使用者的資訊,下面是 controller 類:

@RestController
public class GreetingController {

    private static final String template = "張三";
    private final long id = 1;

    @RequestMapping("/user/{id}")
    public User userInfo(@PathVariable("id")long id) {
        return new User(id, template);
    }
}
複製程式碼

讓應用跑起來

傳統的構建方式是生成一個 war 檔案然後部署到 web 伺服器上,這樣有時會覺得不太方便,因此推薦使用 Spring Boot 的 Maven 外掛快速生成一個獨立的可執行的 jar 檔案,使用 java -jar 命令即可啟動這個應用,所有的類和資源等檔案都被整合到這一個 jar 檔案中,裡面也包括了嵌入式的 servlet 容器(比如 Tomcat),下面是這個應用的啟動類:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
複製程式碼

@SpringBootApplication 這個註解是一個組合註解,它包括:

  • @Configuration:宣告這個類是上下文中的 bean 的配置類
  • @EnableAutoConfiguration:使 Spring 將上下文中掃描到的相關 bean 配置類或 properties 類,並將這些 bean 放到應用上下文中
  • Spring 當檢測到 classpath 下有 spring-webmvc 的依賴後,會自動給應用啟動類上新增 @EnableWebMvc 的註解,它表示這個應用是一個 web 應用,應用啟動時就會執行和 web 相關的操作,比如例項化 DispatcherServlet 類並進行相關的配置
  • @ComponentScan:使 Spring 掃描所有自定義元件類、配置類、業務類以及控制器,並將其裝配

在啟動類中的 main 方法中呼叫 SpringBootApplication.run() 即可實現應用的啟動,和傳統 Java web 應用配置複雜的 web.xml 檔案截然不同,不需要在配置上花費太多時間

構建可執行的 jar

我們可以使用一條簡單的命令來完成應用打包成 jar:

$ ./mvnw clean package
複製程式碼

執行這條命令來啟動應用:


$ java -jar target/gs-rest-service-0.1.0.jar
複製程式碼

做一些簡單的測試

在瀏覽器中訪問 htpp://localhost:8080/user/1,沒問題的話會得到如下響應:

{
    "id": 1,
    "name": "張三"
}
複製程式碼

總結

這僅僅是一個 RESTful web service,更多文件請瀏覽:Building a RESTful Web Service

個人部落格同步更新,獲取更多技術分享請關注:鄭保樂的部落格

相關文章