原標題:Spring認證|使用 Spring 構建 RESTful Web 服務
本指南將引導您完成使用 Spring 創(chuàng)建“Hello, World”RESTful Web 服務的過程。
你將建造什么
您將構建一個接受 HTTP GET 請求的服務http://localhost:8080/greeting。
它將以問候語的 JSON 表示形式響應,如下面的清單所示:
{"id":1,"content":"Hello, World!"}
您可以使用name查詢字符串中的可選參數(shù)自定義問候語,如以下清單所示:
http://localhost:8080/greeting?name=User
的name參數(shù)值將覆蓋的默認值World,并反映在響應時,如下面的列表顯示:
{"id":1,"content":"Hello, User!"}
如何完成本指南
與大多數(shù) Spring入門指南一樣,您可以從頭開始并完成每個步驟,也可以繞過您已經(jīng)熟悉的基本設置步驟。無論哪種方式,您最終都會得到有效的代碼。
要從頭開始,請轉到從 Spring Initializr 開始。
要跳過基礎知識,請執(zhí)行以下操作:
下載并解壓縮本指南的源代碼庫,或使用Git克隆它:git clone https://github.com/spring-guides/gs-rest-service.git
光盤進入 gs-rest-service/initial
跳轉到創(chuàng)建資源表示類。
完成后,您可以根據(jù) 中的代碼檢查結果gs-rest-service/complete。
從 Spring Initializr 開始
如果您使用 Maven,請訪問Spring Initializr以生成具有所需依賴項 (Spring Web) 的新項目。
以下清單顯示了pom.xml選擇 Maven 時創(chuàng)建的文件:
Unresolved directive in - include::initial/pom.xml[]
如果您使用 Gradle,請訪問Spring Initializr以生成具有所需依賴項 (Spring Web) 的新項目。
以下清單顯示了build.gradle在您選擇 Gradle 時創(chuàng)建的文件:
Unresolved directive in - include::initial/build.gradle[]
手動初始化(可選)
如果您想手動初始化項目而不是使用前面顯示的鏈接,請按照以下步驟操作:
導航到https://start.spring.io。此服務包含應用程序所需的所有依賴項,并為您完成大部分設置。
選擇 Gradle 或 Maven 以及您要使用的語言。本指南假設您選擇了 Java。
單擊依賴項并選擇Spring Web。
單擊生成。
下載生成的 ZIP 文件,該文件是使用您的選擇配置的 Web 應用程序的存檔。
如果您的 IDE 具有 Spring Initializr 集成,則可以從您的 IDE 完成此過程。
創(chuàng)建資源表示類
現(xiàn)在您已經(jīng)設置了項目和構建系統(tǒng),您可以創(chuàng)建您的 Web 服務。
通過考慮服務交互來開始這個過程。
該服務將處理對 的GET請求/greeting,可選擇name在查詢字符串中使用一個參數(shù)。該GET請求應200 OK在正文中返回一個帶有 JSON的響應,表示問候語。它應該類似于以下輸出:
{
"id": 1,
"content": "Hello, World!"
}
該id字段是問候語的唯一標識符,是問候語content的文本表示。
要對問候表示建模,請創(chuàng)建一個資源表示類。為此,請?zhí)峁┮粋€普通的舊 Java 對象,其中包含id和content數(shù)據(jù)的字段、構造函數(shù)和訪問器,如下面的清單(來自src/main/java/com/example/restservice/Greeting.java)所示:
Unresolved directive in - include::complete/src/main/java/com/example/restservice/Greeting.java[]
此應用程序使用Jackson JSON庫自動將類型實例編組Greeting為 JSON。默認情況下,Web Starter 包含 Jackson。
創(chuàng)建資源控制器
在 Spring 構建 RESTful Web 服務的方法中,HTTP 請求由控制器處理。這些組件由@RestController注解標識,GreetingController下面的清單 (from src/main/java/com/example/restservice/GreetingController.java)通過返回類的新實例來處理GET請求:/greetingGreeting
Unresolved directive in - include::complete/src/main/java/com/example/restservice/GreetingController.java[]
這個控制器簡潔明了,但背后有很多事情要做。我們一步一步分解。
該@GetMapping注釋確保 HTTP GET 請求/greeting被映射到該greeting()方法。
有其他 HTTP 動詞(例如@PostMappingPOST)的伴隨注釋。還有一個@RequestMapping注釋,它們都源自,并且可以用作同義詞(例如@RequestMapping(method=GET))。
@RequestParam將查詢字符串參數(shù)的值綁定name到方法的name參數(shù)中greeting()。如果name請求中沒有該參數(shù)defaultValue,World則使用of 。
方法主體的實現(xiàn)創(chuàng)建并返回一個新Greeting對象,該對象具有id和content屬性,該對象基于來自counter和的下一個值,并name通過使用 greeting 來格式化給定的template。
傳統(tǒng) MVC 控制器和前面展示的 RESTful Web 服務控制器之間的主要區(qū)別在于 HTTP 響應主體的創(chuàng)建方式。這個 RESTful Web 服務控制器不依賴于視圖技術來執(zhí)行服務器端將問候數(shù)據(jù)呈現(xiàn)為 HTML,而是填充并返回一個Greeting對象。對象數(shù)據(jù)將作為 JSON 直接寫入 HTTP 響應。
此代碼使用 Spring@RestController注釋,它將類標記為控制器,其中每個方法返回域對象而不是視圖。它是同時包含@Controller和的簡寫@ResponseBody。
該Greeting對象必須轉換為 JSON。由于 Spring 的 HTTP 消息轉換器支持,您無需手動進行此轉換。因為Jackson 2在類路徑上,所以MappingJackson2HttpMessageConverter會自動選擇Spring來將Greeting實例轉換為 JSON。
@SpringBootApplication 是一個方便的注釋,它添加了以下所有內容:
@Configuration:將類標記為應用程序上下文的 bean 定義源。
@EnableAutoConfiguration:告訴 Spring Boot 根據(jù)類路徑設置、其他 bean 和各種屬性設置開始添加 bean。例如,如果spring-webmvc在類路徑上,此注釋將應用程序標記為 Web 應用程序并激活關鍵行為,例如設置DispatcherServlet.
@ComponentScan:告訴 Spring 在包中查找其他組件、配置和服務com/example,讓它找到控制器。
該main()方法使用 Spring Boot 的SpringApplication.run()方法來啟動應用程序。您是否注意到?jīng)]有一行 XML?也沒有web.xml文件。該 Web 應用程序是 100% 純 Java 的,您無需處理任何管道或基礎設施的配置。
構建一個可執(zhí)行的 JAR
您可以使用 Gradle 或 Maven 從命令行運行應用程序。您還可以構建包含所有必要依賴項、類和資源的單個可執(zhí)行 JAR 文件并運行它。構建一個可執(zhí)行的 jar 可以很容易地將服務作為應用程序在整個開發(fā)生命周期中、跨不同環(huán)境等進行交付、版本化和部署。
如果您使用 Gradle,則可以使用./gradlew bootRun. 或者,您可以使用./gradlew build并運行 JAR 文件來構建JAR 文件,如下所示:
java -jar build/libs/gs-rest-service-0.1.0.jar
如果您使用 Maven,則可以使用./mvnw spring-boot:run. 或者,您可以構建 JAR 文件,./mvnw clean package然后運行 JAR 文件,如下所示:
java -jar target/gs-rest-service-0.1.0.jar
此處描述的步驟創(chuàng)建了一個可運行的 JAR。您還可以構建經(jīng)典的 WAR 文件。
顯示日志輸出。該服務應該會在幾秒鐘內啟動并運行。
測試服務
現(xiàn)在服務已啟動,請訪問http://localhost:8080/greeting,您應該看到:
{"id":1,"content":"Hello, World!"}
name通過訪問提供查詢字符串參數(shù)http://localhost:8080/greeting?name=User。請注意content屬性的值如何從Hello, World!變?yōu)镠ello, User!,如下面的清單所示:
{"id":2,"content":"Hello, User!"}
此更改表明 中的@RequestParam安排GreetingController按預期工作。該name參數(shù)已被賦予默認值,World但可以通過查詢字符串顯式覆蓋。
還要注意id屬性如何從1變?yōu)?。這證明您正在GreetingController跨多個請求處理同一個實例,并且它的counter字段在每次調用時都按預期遞增。
總結
恭喜!您剛剛使用 Spring 開發(fā)了一個 RESTful Web 服務。