本指南將引導(dǎo)您完成使用 Spring 創(chuàng)建“Hello, World”RESTful Web 服務(wù)的過(guò)程。
你將建造什么
您將構(gòu)建一個(gè)接受 HTTP GET 請(qǐng)求的服務(wù)
http://localhost:8080/greeting。
它將以 JSON 表示的問(wèn)候進(jìn)行響應(yīng),如以下清單所示:
{"id":1,"content":"Hello, World!"}復(fù)制
您可以在查詢字符串中使用可選name參數(shù)自定義問(wèn)候語(yǔ),如以下清單所示:
http://localhost:8080/greeting?name=User復(fù)制
name參數(shù)值覆蓋默認(rèn)值World并反映在響應(yīng)中,如以下清單所示:
{"id":1,"content":"Hello, User!"}復(fù)制
你需要什么
- 約15分鐘
- 最喜歡的文本編輯器或 IDE
- JDK 1.8或更高版本
- Gradle 4+或Maven 3.2+
-
您還可以將代碼直接導(dǎo)入 IDE:
- 彈簧工具套件 (STS)
- IntelliJ IDEA
如何完成本指南
像大多數(shù) Spring入門(mén)指南一樣,您可以從頭開(kāi)始并完成每個(gè)步驟,也可以繞過(guò)您已經(jīng)熟悉的基本設(shè)置步驟。無(wú)論哪種方式,您最終都會(huì)得到工作代碼。
要從頭開(kāi)始,請(qǐng)繼續(xù)從 Spring Initializr 開(kāi)始。
要跳過(guò)基礎(chǔ)知識(shí),請(qǐng)執(zhí)行以下操作:
- 下載并解壓縮本指南的源存儲(chǔ)庫(kù),或使用Git克隆它:git clone https://github.com/spring-guides/gs-rest-service.git
- 光盤(pán)進(jìn)入gs-rest-service/initial
- 繼續(xù)創(chuàng)建資源表示類。
完成后,您可以對(duì)照中的代碼檢查結(jié)果gs-rest-service/complete。
從 Spring Initializr 開(kāi)始
您可以使用這個(gè)預(yù)先初始化的項(xiàng)目并單擊 Generate 下載 ZIP 文件。此項(xiàng)目配置為適合本教程中的示例。
手動(dòng)初始化項(xiàng)目:
- 導(dǎo)航到https://start.spring.io。該服務(wù)提取應(yīng)用程序所需的所有依賴項(xiàng),并為您完成大部分設(shè)置。
- 選擇 Gradle 或 Maven 以及您要使用的語(yǔ)言。本指南假定您選擇了 Java。
- 單擊Dependencies并選擇Spring Web。
- 單擊生成。
- 下載生成的 ZIP 文件,該文件是根據(jù)您的選擇配置的 Web 應(yīng)用程序的存檔。
如果您的 IDE 具有 Spring Initializr 集成,您可以從您的 IDE 完成此過(guò)程。
你也可以從 Github 上 fork 項(xiàng)目并在你的 IDE 或其他編輯器中打開(kāi)它。
創(chuàng)建資源表示類
現(xiàn)在您已經(jīng)設(shè)置了項(xiàng)目和構(gòu)建系統(tǒng),您可以創(chuàng)建您的系統(tǒng) Web 服務(wù)。
從考慮服務(wù)交互開(kāi)始這個(gè)過(guò)程。
該服務(wù)將處理對(duì) 的GET請(qǐng)求/greeting,可以選擇name在查詢字符串中使用參數(shù)。該GET請(qǐng)求應(yīng)200 OK在表示問(wèn)候的正文中返回帶有 JSON 的響應(yīng)。它應(yīng)該類似于以下輸出:
{
"id": 1,
"content": "Hello, World!"
}復(fù)制
該id字段是問(wèn)候語(yǔ)的唯一標(biāo)識(shí)符,是問(wèn)候語(yǔ)content的文本表示。
要對(duì)問(wèn)候表示建模,請(qǐng)創(chuàng)建一個(gè)資源表示類。為此,請(qǐng)?zhí)峁┮粋€(gè)普通的方法 Java 對(duì)象,其中包含用于id和content數(shù)據(jù)的字段、構(gòu)造函數(shù)和訪問(wèn)器,如以下清單(來(lái)自
src/main/java/com/example/restservice/Greeting.java)所示:
package com.example.restservice;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
此應(yīng)用程序使用Jackson JSON庫(kù)將類型的實(shí)例自動(dòng)編組Greeting為 JSON。網(wǎng)絡(luò)啟動(dòng)器默認(rèn)包含 Jackson。
創(chuàng)建資源控制器
在 Spring 構(gòu)建 RESTful Web 服務(wù)的方法中,HTTP 請(qǐng)求由控制器處理。這些組件由@RestController注釋標(biāo)識(shí),GreetingController下面的清單 (from )通過(guò)返回類的新實(shí)例來(lái)
src/main/java/com/example/restservice/GreetingController.java處理GET請(qǐng)求:/greetingGreeting
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));
}
}復(fù)制
這個(gè)控制器簡(jiǎn)潔明了,但引擎蓋下有很多事情要做。我們一步一步分解。
@GetMapping注釋確保 HTTP GET 請(qǐng)求/greeting映射到greeting()方法。
有其他 HTTP 動(dòng)詞的伴隨注釋(例如@PostMappingPOST)。還有一個(gè)@RequestMapping它們都源自的注釋,并且可以用作同義詞(例如@RequestMapping(method=GET))。
@RequestParam將查詢字符串參數(shù)的值綁定name到方法的name參數(shù)中greeting()。如果name請(qǐng)求中沒(méi)有參數(shù),則使用defaultValueof World。
方法體的實(shí)現(xiàn)創(chuàng)建并返回一個(gè)新Greeting對(duì)象,該對(duì)象具有id和content基于下一個(gè)值的屬性,并使用 greetingcounter格式化給定的格式。nametemplate
傳統(tǒng) MVC 控制器和前面顯示的 RESTful Web 服務(wù)控制器之間的一個(gè)關(guān)鍵區(qū)別是 HTTP 響應(yīng)主體的創(chuàng)建方式。這個(gè) RESTful Web 服務(wù)控制器不是依靠視圖技術(shù)來(lái)執(zhí)行服務(wù)器端將問(wèn)候數(shù)據(jù)呈現(xiàn)為 HTML,而是填充并返回一個(gè)Greeting對(duì)象。對(duì)象數(shù)據(jù)將作為 JSON 直接寫(xiě)入 HTTP 響應(yīng)。
此代碼使用 Spring@RestController注釋,它將類標(biāo)記為控制器,其中每個(gè)方法都返回域?qū)ο蠖皇且晥D。它是同時(shí)包含@Controller和的簡(jiǎn)寫(xiě)@ResponseBody。
該Greeting對(duì)象必須轉(zhuǎn)換為 JSON。感謝 Spring 的 HTTP 消息轉(zhuǎn)換器支持,您無(wú)需手動(dòng)進(jìn)行此轉(zhuǎn)換。因?yàn)镴ackson 2在類路徑上,所以會(huì)自動(dòng)選擇 Spring
MappingJackson2HttpMessageConverter將Greeting實(shí)例轉(zhuǎn)換為 JSON。
@SpringBootApplication是一個(gè)方便的注釋,它添加了以下所有內(nèi)容:
- @Configuration: 將類標(biāo)記為應(yīng)用程序上下文的 bean 定義源。
- @EnableAutoConfiguration:告訴 Spring Boot 根據(jù)類路徑設(shè)置、其他 bean 和各種屬性設(shè)置開(kāi)始添加 bean。例如,如果spring-webmvc位于類路徑上,則此注釋將應(yīng)用程序標(biāo)記為 Web 應(yīng)用程序并激活關(guān)鍵行為,例如設(shè)置DispatcherServlet.
- @ComponentScan: 告訴 Spring 在包中查找其他組件、配置和服務(wù)com/example,讓它找到控制器。
該main()方法使用 Spring Boot 的SpringApplication.run()方法來(lái)啟動(dòng)應(yīng)用程序。您是否注意到?jīng)]有一行 XML?也沒(méi)有web.xml文件。這個(gè) Web 應(yīng)用程序是 100% 純 Java,您不必處理任何管道或基礎(chǔ)設(shè)施的配置。
構(gòu)建一個(gè)可執(zhí)行的 JAR
您可以使用 Gradle 或 Maven 從命令行運(yùn)行應(yīng)用程序。您還可以構(gòu)建一個(gè)包含所有必要依賴項(xiàng)、類和資源的單個(gè)可執(zhí)行 JAR 文件并運(yùn)行它。構(gòu)建可執(zhí)行 jar 可以在整個(gè)開(kāi)發(fā)生命周期、跨不同環(huán)境等中輕松地作為應(yīng)用程序交付、版本化和部署服務(wù)。
如果您使用 Gradle,則可以使用./gradlew bootRun. 或者,您可以使用構(gòu)建 JAR 文件./gradlew build,然后運(yùn)行 ?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 目標(biāo)/gs-rest-service-0.1.0.jar
此處描述的步驟創(chuàng)建了一個(gè)可運(yùn)行的 JAR。您還可以構(gòu)建經(jīng)典的 WAR 文件。
顯示記錄輸出。該服務(wù)應(yīng)在幾秒鐘內(nèi)啟動(dòng)并運(yùn)行。
測(cè)試服務(wù)
現(xiàn)在服務(wù)已經(jīng)啟動(dòng),訪問(wèn)
http://localhost:8080/greeting,您應(yīng)該會(huì)看到:
{"id":1,"content":"Hello, World!"}復(fù)制
通過(guò)訪問(wèn)提供name查詢字符串參數(shù)
http://localhost:8080/greeting?name=User。content請(qǐng)注意屬性的值如何從Hello, World!變?yōu)?span style="color:rgb(0,0,153);">Hello, User!,如以下清單所示:
{"id":2,"content":"Hello, User!"}復(fù)制
這一變化表明,@RequestParam安排在GreetingController按預(yù)期工作。該name參數(shù)已被賦予默認(rèn)值,World但可以通過(guò)查詢字符串顯式覆蓋。
還要注意id屬性是如何從1變?yōu)?的2。這證明您正在GreetingController跨多個(gè)請(qǐng)求處理同一個(gè)實(shí)例,并且其counter字段在每次調(diào)用時(shí)都按預(yù)期遞增。
概括
恭喜!您剛剛使用 Spring 開(kāi)發(fā)了一個(gè) RESTful Web 服務(wù)。
審核編輯:湯梓紅
-
Web
+關(guān)注
關(guān)注
2文章
1269瀏覽量
69617 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14368 -
Restful
+關(guān)注
關(guān)注
0文章
11瀏覽量
3552
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論