Spring Boot — RESTful Web Services — Basic(上)

Tinghuan Wang
summer's code life
Published in
3 min readJan 20, 2021

如何建立RESTful Web Services,可以用下圖的方式了解RESTful可以做什麼事情:

圖片來源:https://www.udemy.com/course/spring-web-services-tutorial/

文章也主要從三個角度去分享:Basic、Advanced、Tools/Frameworks。

Step1. Create Project

一樣使用https://start.spring.io 建立Spring Project,Dependencies 要選擇Spring Web/DevTools/JPA/H2(memory database)。

示範的程式碼:git

Eclipse import 專案後需要等Maven 下載dependencies。

src/main/java:放置Java Code。
src/main/resource:放置resource,像是properties。
src/test/java:放置測試Code。
pom.xml:放置使用哪些dependencies。Spring boot 預設會使用「spring-boot-starter-test」。

啟動Server的方式 src/main/java > com.restful.sample.webService > WebServiceApplication.java Run as Java Application。

Step2. RESTful Services

先前文章有提過RESTful Services。

Step3. Create Get Request

在com.restful.sample.webService底下建立HelloWorldController.java。

@RestController : handle rest request。
@GetMapping: 使用Get Method,可以使用以下兩種寫法。

@GetMapping("/hello-world")@RequestMapping(method=RequestMethod.GET, path="/hello-world")

接著在網址輸入http://localhost:8080/hello-world,就可以看到「Hello World」。

Step4. Return a Bean

Step3. request回傳的是字串,現在示範回傳object。建立HelloWorldBean.java

HelloWorldController.java新增method — helloWorldBean

@GetMapping("/hello-world-bean")
public HelloWorldBean helloWorldBean(){
return new HelloWorldBean("Hello World");
}

接著在網址輸入http://localhost:8080/hello-world-bean,就可以看到「{“message”:”Hello World”}」。

可以看到回傳的object會被自動轉成JSON。

Step5. Dispatcher Servlet

Dispatcher Servlet負責管理request和controller 之間的對應,根據request的內容執行對應的controller。

如果想要了解Spring Boot做了什麼事情,要先將log 打開。

src/main/resources > application.properties 加上

logging.level.org.springframework= DEBUG

CONDITIONS EVALUATION REPORT 列出了自動設定的內容:

這幾行是自動設定dispatcher servlet,當SpringBoot 在classpath 找到dispatcher servlet denpendency,就會自動幫忙設定dispatcher。

這幾行是設定Error Page。

Springboot 會看classpath 有哪些jar 檔案,在自動幫忙設置。

HttpMessageConverter將bean轉成json回傳給response,Jackson也是用在json和bean的轉換。

看log 也可以看到如下文字,此代表的是DispatcherServlet處理”/hello-world-bean” request。

2021-01-20 14:04:31.980 DEBUG 31632 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : GET "/hello-world-bean", parameters={}

Step6. Get parameter

取得path的變數可以使用「{}」, 像是:@GetMapping(“/hello-world/path-variable/{name}”)取得後assign給name,name是任意值。之後在mathod 取得name @PathVariable String name

@GetMapping("/hello-world/path-variable/{name}")
public HelloWorldBean helloWorldPathVariable(@PathVariable String name){
return new HelloWorldBean(String.format("Hello World, %s", name));
}

在網址輸入http://localhost:8080/hello-world/path-variable/summer可以看到「{“message”:”Hello World, summer”}」。

Step7. Create User Bean and User Service

建立user package 並在底下建立User.java model。

接著再建立UserDaoService.java,Dao 通常用來連結Database。static 代表將users 儲存到記憶體,如果沒有使用static 則當有1000個object,users就要在記憶體存1000次。

@ Component:告知spring 此為bean。

Step8. Create User Controller

UserController.java

@ Autowired將bean和class 連在一起。

birthDate預設輸出為timestamp,如果不想要輸出格式為timestamp可以在src/main/resources > application.properties 加上

spring.jackson.serialization.write-dates-as-timestamps=false

Step9. Create Post Controller

在UserController.java 新增Post Controller,如果想要從Request Body取得值可以使用「@RequestBody」。將@RequestBody和object User mapping起來「@RequestBody User user」。

@PostMapping("/users")
public User createUser(@RequestBody User user){
return service.save(user);
}

使用postman 來用post request。

Step10. Setting Response Status

如果想要將新增的status code改成201可以使用ResponseEntity。

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user){
User newUser = service.save(user);
return new ResponseEntity<>(newUser,HttpStatus.CREATED);
}

HttpStatus的狀態碼可以直接看官網

--

--