換一種方式編寫 Spring MVC 介面
- 寫在前面
通常我們編寫 Spring MVC 介面的正規化是這樣的:
@RestController
@RequestMapping(
"/v1/userinfo")
public
class
UserInfoController {
@GetMapping(
"/foo")
public String foo() {
return
"felord.cn";
}
}
這種我都寫吐了,今天換個口味,使用 Spring 5 新引入的函式式端點( Functional Endpoints)來耍耍。 這種方式同樣支援 Spring Webflux。
請注意可使用該特性的 Spring 版本不低於 Spring 5.2
2. 依賴
為了演示,這裡極簡化只引入 Spring MVC 的 starter :
<
dependency>
<
groupId>org.springframework.boot
</
groupId>
<
artifactId>spring-boot-starter-web
</
artifactId>
</
dependency>
3. RouterFunction
在函式式端點的寫法中,傳統的請求對映(@RequestMapping)被路由函式(RouterFunction)所代替。上面的寫法等同於:
@Bean
public RouterFunction<ServerResponse>
fooFunction
() {
return RouterFunctions.route()
.GET(
"/v1/userinfo/foo", request -> ServerResponse.ok()
.body(
"felord.cn"))
.build();
}
在該示例中,我使用了 RouterFunctions.route() 建立了一個RouterFunction,然後RouterFunction 提供了從請求到響應的細節操作。
4. ServerRequest/ServerResponse
ServerRequest 是對伺服器端的HTTP請求的抽象,你可以透過該抽象獲取請求的細節。對應的,ServerResponse 是對伺服器端響應的抽象,你也可以透過該抽象構建響應的細節。這兩個概念由下面的 HandlerFunction 介面進行 請求→ 響應 處理。
5. HandlerFunction
HandlerFunction 是一個函式式介面,它提供了從請求( ServerRequest)到響應(ServerResponse)的函式對映抽象。通常你的業務邏輯由該介面進行實現。從 ServerRequest 中獲取請求的細節,然後根據業務構建一個 ServerResponse 響應。
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().body(
"felord.cn");
6. RequestPredicate
RequestPredicate 可以讓你根據請求的一些細節,比如 請求方法、 請求頭、 請求引數等等進行斷言以決定是否路由。
這裡舉一個例子,假如我們希望請求介面/v1/userinfo/predicate時根據不同的引數處理不同的業務,當攜帶引數 plan時才能進行處理。我們可以這麼寫:
@Bean
public RouterFunction<ServerResponse>
predicateFunction
() {
return RouterFunctions.route()
.GET(
"/v1/userinfo/predicate",
request -> request.param(
"plan").isPresent(),
request -> ServerResponse.ok().body(
"felord.cn"))
.build();
}
然後我們測試一下:
當攜帶引數 plan時:
GET
HTTP/1.1
200
Content-Type:
text/plain;charset=UTF-8
Content-Length:
9
Date:
Thu,
14 May 2020 07:57:35 GMT
Keep-Alive:
timeout=60
Connection:
keep-alive
felord.cn
不攜帶引數plan時:
GET
http:/
/localhost:8080/v1/userinfo/predicate
HTTP/
1.1
404
Vary:
Origin
Vary: Access-Control-Request-
Method
Vary: Access-Control-Request-Headers
Content-
Type: application/json
Transfer-
Encoding:
chunked
Date: Thu,
14 May
2020 08
:
00
:
15 GMT
Keep-
Alive: timeout=
60
Connection: keep-alive
{
"timestamp":
"2020-05-14T08:00:15.659+0000",
"status":
404,
"error":
"Not Found",
"message":
"No message available",
"path":
"/v1/userinfo/predicate"
}
7. 小結
函式式端點是 Spring 5 提供的一個新的介面正規化風格,對於 Spring MVC 來說 Spring 5.2 才進行了支援。也是順應函數語言程式設計的一個未來趨勢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2714738/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用mvc方式編寫一個模組,但有點不明白的地方!MVC
- spring mvc 返回json資料的四種方式SpringMVCJSON
- 編寫Spring MVC控制器的14個技巧SpringMVC
- [Spring MVC] - SpringMVC的各種引數繫結方式SpringMVC
- 手寫Spring MVC框架(一) 實現簡易版mvc框架SpringMVC框架
- Spring MVC 核心類和介面SpringMVC
- 編寫一個介面壓測工具
- 寶塔兩種方式編寫 crontab 自動任務
- 尋找寫程式碼感覺(三)之使用 Spring Boot 編寫介面Spring Boot
- Mock測試你的Spring MVC介面MockSpringMVC
- 編寫難於測試的程式碼的5種方式
- Spring Boot下Profile的四種切換方式思路總結Spring Boot
- 編寫註冊介面
- 一個基於Java的介面快速開發框架!無需編寫程式碼,透過UI介面編寫介面!Java框架UI
- Python教程:Pandas資料轉換編碼的10種方式Python
- Spring Mvc原理分析(一)SpringMVC
- spring mvc3.1.0 日期自動轉換SpringMVC
- Spring MVC 中 HttpMessageConverter 轉換器SpringMVCHTTP
- react,vue編寫介面文件ReactVue
- spring的四種注入方式Spring
- Spring MVC 中文編碼亂碼解決SpringMVC
- 手寫 Spring 事務、IOC、DI 和 MVCSpringMVC
- 帶你一步一步手寫一個簡單的Spring MVCSpringMVC
- 記錄一次阿里架構師全程手寫Spring MVC阿里架構SpringMVC
- Java多種寫檔案方式Java
- java中寫建構函式的另外一種方式Java函式
- Spring MVC入門教程(一)SpringMVC
- 自己寫一個mvc框架吧(一)MVC框架
- 用PHP編寫登陸介面PHP
- Spring注入Bean的幾種方式SpringBean
- Spring Boot的五種部署方式Spring Boot
- 膜拜阿里架構師全程手寫Spring MVC阿里架構SpringMVC
- 看看一個老程式設計師是如何手寫Spring MVC的!程式設計師SpringMVC
- CSS 書寫模式的24種方式CSS模式
- MySQL 寫入壓測幾種方式MySql
- 提供介面的幾種常用方式 (二,BeeGo)Go
- Python多種介面請求方式示例Python
- spring mvc專案配置一覽SpringMVC