建構 RESTful Web 服務

本指南將引導您使用 Spring 建立 “Hello, World” RESTful web 服務的過程。

您將建構的內容

您將建構一個服務,該服務將接受位於 https://127.0.0.1:8080/greeting 的 HTTP GET 請求。

它將以 JSON 格式回應問候語,如下列清單所示

{"id":1,"content":"Hello, World!"}

您可以透過查詢字串中的選用 name 參數來自訂問候語,如下列清單所示

https://127.0.0.1:8080/greeting?name=User

name 參數值會覆寫預設值 World,並反映在回應中,如下列清單所示

{"id":1,"content":"Hello, User!"}

您需要的東西

如何完成本指南

如同大多數 Spring 入門指南,您可以從頭開始並完成每個步驟,或者您可以略過您已熟悉的基本設定步驟。無論哪種方式,您最終都會得到可運作的程式碼。

若要從頭開始,請繼續前往 從 Spring Initializr 開始

若要略過基本步驟,請執行下列操作

當您完成時,您可以對照 gs-rest-service/complete 中的程式碼檢查您的結果。

從 Spring Initializr 開始

您可以使用這個 預先初始化的專案,然後按一下 Generate (產生) 下載 ZIP 檔案。此專案已設定為符合本教學課程中的範例。

若要手動初始化專案

  1. 導覽至 https://start.spring.io。此服務會提取應用程式所需的所有相依性,並為您完成大部分的設定。

  2. 選擇 Gradle 或 Maven 以及您想要使用的語言。本指南假設您選擇 Java。

  3. 按一下 Dependencies (相依性) 並選取 Spring Web

  4. 按一下 Generate (產生)

  5. 下載產生的 ZIP 檔案,這是使用您的選擇設定的 Web 應用程式的封存檔。

如果您的 IDE 具有 Spring Initializr 整合,您可以從您的 IDE 完成此程序。
您也可以從 Github 分叉專案,並在您的 IDE 或其他編輯器中開啟它。

建立資源表示類別

現在您已設定專案和建置系統,您可以建立您的 Web 服務。

從思考服務互動開始此過程。

此服務將處理針對 /greetingGET 請求,選擇性地在查詢字串中帶有 name 參數。GET 請求應傳回 200 OK 回應,且主體中包含代表問候語的 JSON。它應類似於下列輸出

{
    "id": 1,
    "content": "Hello, World!"
}

id 欄位是問候語的唯一識別碼,而 content 是問候語的文字表示法。

若要為問候語表示法建模,請建立資源表示類別。若要執行此操作,請為 idcontent 資料提供 Java 記錄類別,如下列清單 (來自 src/main/java/com/example/restservice/Greeting.java) 所示

package com.example.restservice;

public record Greeting(long id, String content) { }
此應用程式使用 Jackson JSON 程式庫自動將 Greeting 類型的執行個體封送處理為 JSON。Web starter 預設包含 Jackson。

建立資源控制器

在 Spring 的建構 RESTful Web 服務方法中,HTTP 請求由控制器處理。這些元件由 @RestController 註解識別,且下列清單 (來自 src/main/java/com/example/restservice/GreetingController.java) 中顯示的 GreetingController 處理針對 /greetingGET 請求,方法是傳回 Greeting 類別的新執行個體

package com.example.restservice;

import java.util.concurrent.atomic.AtomicLong;

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

@RestController
public class GreetingController {

	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}

此控制器簡潔且簡單,但在底層運作了很多功能。我們將逐步分解它。

@GetMapping 註解確保針對 /greeting 的 HTTP GET 請求會對應到 greeting() 方法。

其他 HTTP 動詞 (例如,POST 的 @PostMapping) 也有對應的註解。還有一個 @RequestMapping 註解,它們都衍生自該註解,並且可以作為同義詞 (例如,@RequestMapping(method=GET))。

@RequestParam 將查詢字串參數 name 的值繫結到 greeting() 方法的 name 參數。如果請求中缺少 name 參數,則會使用 WorlddefaultValue

方法主體的實作會建立並傳回新的 Greeting 物件,其 idcontent 屬性基於來自 counter 的下一個值,並透過使用問候語 template 來格式化給定的 name

傳統 MVC 控制器與先前顯示的 RESTful Web 服務控制器之間的主要差異在於 HTTP 回應主體的建立方式。此 RESTful Web 服務控制器不是依賴檢視技術來執行問候語資料到 HTML 的伺服器端轉譯,而是填入並傳回 Greeting 物件。物件資料將以 JSON 格式直接寫入 HTTP 回應。

此程式碼使用 Spring @RestController 註解,該註解將類別標記為控制器,其中每個方法都會傳回網域物件而不是檢視。它是同時包含 @Controller@ResponseBody 的簡寫。

Greeting 物件必須轉換為 JSON。由於 Spring 的 HTTP 訊息轉換器支援,您不需要手動執行此轉換。因為 Jackson 2 在類別路徑上,所以 Spring 的 MappingJackson2HttpMessageConverter 會自動選擇將 Greeting 執行個體轉換為 JSON。

執行服務

Spring Initializr 為您建立應用程式類別。在此案例中,您不需要進一步修改類別。下列清單 (來自 src/main/java/com/example/restservice/RestServiceApplication.java) 顯示應用程式類別

package com.example.restservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RestServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(RestServiceApplication.class, args);
	}

}

@SpringBootApplication 是一個便利註解,新增了下列所有內容

  • @Configuration:將類別標記為應用程式內容的 Bean 定義來源。

  • @EnableAutoConfiguration:告知 Spring Boot 根據類別路徑設定、其他 Bean 和各種屬性設定開始新增 Bean。例如,如果 spring-webmvc 在類別路徑上,則此註解會將應用程式標記為 Web 應用程式,並啟動主要行為,例如設定 DispatcherServlet

  • @ComponentScan:告知 Spring 在 com/example 套件中尋找其他元件、組態和服務,使其找到控制器。

main() 方法使用 Spring Boot 的 SpringApplication.run() 方法啟動應用程式。您是否注意到沒有單行 XML?也沒有 web.xml 檔案。此 Web 應用程式是 100% 純 Java,而且您不必處理設定任何管線或基礎結構。

建置可執行 JAR

您可以使用 Gradle 或 Maven 從命令列執行應用程式。您也可以建置包含所有必要相依性、類別和資源的單一可執行 JAR 檔案並執行該檔案。建置可執行 JAR 讓您可以輕鬆地在整個開發生命週期、跨不同環境等情況下,將服務作為應用程式發佈、版本控制和部署。

如果您使用 Gradle,您可以使用 ./gradlew bootRun 來執行應用程式。或者,您可以使用 ./gradlew build 來建置 JAR 檔案,然後執行 JAR 檔案,如下所示

java -jar build/libs/gs-rest-service-0.1.0.jar

如果您使用 Maven,您可以使用 ./mvnw spring-boot:run 來執行應用程式。或者,您可以使用 ./mvnw clean package 建置 JAR 檔案,然後執行 JAR 檔案,如下所示

java -jar target/gs-rest-service-0.1.0.jar
此處描述的步驟會建立可執行 JAR。您也可以 建置傳統 WAR 檔案

會顯示記錄輸出。服務應在幾秒鐘內啟動並執行。

測試服務

現在服務已啟動,請造訪 https://127.0.0.1:8080/greeting,您應該會看到

{"id":1,"content":"Hello, World!"}

透過造訪 https://127.0.0.1:8080/greeting?name=User 來提供 name 查詢字串參數。請注意 content 屬性的值如何從 Hello, World! 變更為 Hello, User!,如下列清單所示

{"id":2,"content":"Hello, User!"}

此變更示範了 GreetingController 中的 @RequestParam 配置如預期般運作。name 參數已給定預設值 World,但可以透過查詢字串明確覆寫。

另請注意 id 屬性如何從 1 變更為 2。這證明您正在針對多個請求中的相同 GreetingController 執行個體工作,並且其 counter 欄位正在如預期般在每次呼叫時遞增。

摘要

恭喜!您剛剛使用 Spring 開發了一個 RESTful Web 服務。

取得程式碼

免費

在雲端中工作

在 Spring Academy 的雲端中完成本指南。

前往 Spring Academy