Spring Boot — RESTful Web Services — Basic(上)
如何建立RESTful Web Services,可以用下圖的方式了解RESTful可以做什麼事情:
文章也主要從三個角度去分享: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的狀態碼可以直接看官網。