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