Spring Boot|練習一:Building a RESTful Web Service


因需要使用 Spring Boot 的 RESTful,便照著官方教學試試~
一開始啟動失敗,後來參考前輩的 code,發現關鍵點並做增補,就成功了!好有趣!
*本篇僅用以記錄練習過程,未涉及深入概念*




練習目標:做出一個 web service,用以接收 HTTP 的 GET request。
也就是在網頁 search bar 上輸入 http://localhost:8080/greeting 時可以顯示出一串 JSON 文字:
{"id":1,"content":"Hello, World!"}

再進一步,還可以藉著設定不同的參數而獲得不同的結果:
輸入:http://localhost:8080/greeting?name=User
輸出:{"id":1,"content":"Hello, User!"}


製作這項練習專案需要:
  • 慣用的 IDE 或 text editor
  • JDK 1.8 以上
  • Maven 3.2 以上或 Gradle 4 以上

我所使用的是 Eclipse 2021-03 / JDK 1.8 / Maven 4.0.0


第一步:pom.xml

在 pom.xml 中,我們會定義所需的 Maven Dependencies,以往都是到 Maven Repository 網站一個一個搜尋,一個一個複製貼上。在這裡,直接使用官方的 Spring Initailizr,選擇需要的 Dependencies,點下 GENERATE,便會自動產出所需的專案包,內含設定好的 pom.xml,完全懶人不用自己慢慢抓!有夠方便!

附圖中的三個 dependencies 是我這次專案需要使用的,另外我目前還是使用 Java 8。




第二步:Model   -   Create a Resource Representation Class

前面有提到,在這個專案中,我們要呈現的結果是:
{
    "id": 1,
    "content": "Hello, World!"
}
其中有 id 和 content 兩個 field,在這一步,我們要先創建能夠呈現/包含它們的 class。
原文是說要 model 這個 representation,喜歡這個詞。

在這裡創建一個名為 Greeting 的 POJO class,
包含兩個 field、一個含參數的 constructor、兩個相應的 getter(原文稱其為 accessor)。


另外,官網提到,此專案的 web starter 中內含 Jackson JSON library,可以自動將上述的 Model 轉換成 JSON。真的好方便!



第三步:Controller   -   Create a Resource Controller

Controller 用來控制流程。
在這個專案中,我們希望進入 http://localhost:8080/greeting 時,能藉由 GET request 來獲得 JSON 資訊。
這個 Controller 會接收 HTTP GET request 的資訊,並傳回 Greeting 實例(instance)


@RestController 代表此類為 RestController,結合了 @Controller 及 @ResponseBody
@GetMapping("/url") 將針對該 url 的 HTTP GET request 與該方法 mapping 起來;意即 @RequestMapping(method = GET)
@RequestParam 用來將從 url 中接收的資料作為 parameter 傳給該方法
 - value 即為 url 中的參數,在此案例中為 name(/greeting?name=ABC)
 - defaultValue 代表,當在 url 中並未收到 name 的值時,會將 defaultValue 的值作為 parameter 傳給方法,在此案例中為 World

為了要傳回 Greeting 實例,我們會需要兩個參數:new Greeting(long idString content),上方的 counter 及 template 便是為其預備。
  • id 希望隨著存取次數而遞增,故傳入 counter.incrementAndGet() 給 建構式。
  • content 希望有統一樣板,故先定義出 template,並在傳入建構式時使用 String.format(template, name),將從 method 接收到的 name 設定給 %s。

*web starter 會將所獲得的 Greeting instance 自動轉換成 JSON,顯示在畫面上😻


第四步:@SpringBootApplication

創建一個有 main() 的 class,作為程式進入點。
  • 在 class 上方標註 @SpringBootApplication
  • 在 main() 中使用 SpringApplication.run(ClassName.class, args)


在 @SpringBootApplication 中還有其他方便的 @annotation 可使用,可至官網了解更多:
  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

*在此專案中,完全不需要撰寫任何其他的 xml,就連 web.xml 也不需要!


第五步:執行!

在 windows Maven 下,使用 cmd,切換到該專案資料夾,並輸入:
mvnw spring-boot:run
待執行完成後,保持 cmd 畫面開啟,到網頁輸入 http://localhost:8080/greeting 即可看到獲得的 JSON 字串!



***

傳統 MVC controller 與 RESTful web service controller 最關鍵的不同在於 response:
傳統 MVC 依賴 view(HTML etc)來呈現資料,
RESTful web service 則是直接回傳 Greeting object,其物件資料會直接被轉成 JSON 寫進 HTTP response 裡。


留言