成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring WebFlux使用函數(shù)式編程之HandlerFunction

開發(fā) 架構(gòu)
RouterFunctions.route()(無(wú)參數(shù))為創(chuàng)建路由器函數(shù)提供了一個(gè)流暢的構(gòu)建器,而RouterFunctions.route(RequestPredicate, HandlerFunction)提供了創(chuàng)建路由器的直接方法。

本篇主要內(nèi)容:

  • RouterFunction的使用

概述

路由器函數(shù)用于將請(qǐng)求路由到相應(yīng)的HandlerFunction。通常情況下,你不需要自己編寫路由器函數(shù),而是使用RouterFunctions類中的方法來(lái)創(chuàng)建一個(gè)。RouterFunctions.route()(無(wú)參數(shù))為創(chuàng)建路由器函數(shù)提供了一個(gè)流暢的構(gòu)建器,而RouterFunctions.route(RequestPredicate, HandlerFunction)提供了創(chuàng)建路由器的直接方法。

通常,建議使用route()構(gòu)建器,因?yàn)樗鼮榈湫偷挠成鋱?chǎng)景提供了方便的快捷方式,而不需要難以發(fā)現(xiàn)的靜態(tài)導(dǎo)入。例如,路由器函數(shù)構(gòu)建器提供了方法GET(String, HandlerFunction)來(lái)為GET請(qǐng)求創(chuàng)建映射;和POST(String, HandlerFunction)用于POST。

除了基于HTTP方法的映射之外,路由構(gòu)建器還提供了一種在映射到請(qǐng)求時(shí)引入附加謂詞的方法。對(duì)于每個(gè)HTTP方法,都有一個(gè)以RequestPredicate作為參數(shù)的重載變體,盡管可以表示附加的約束。

謂詞Predicates

你可以編寫自己的RequestPredicate,但RequestPredites類提供了常用的實(shí)現(xiàn),基于請(qǐng)求路徑、HTTP方法、內(nèi)容類型等。以下示例使用請(qǐng)求謂詞根據(jù)Accept標(biāo)頭創(chuàng)建約束:

RouterFunction<ServerResponse> route = RouterFunctions.route()
.GET("/hello-world", accept(MediaType.TEXT_PLAIN),
request -> ServerResponse.ok().bodyValue("Hello World")).build();

你可以使用以下命令將多個(gè)請(qǐng)求謂詞組合在一起:

  • RequestPredicate.and(RequestPredicate)? // 兩者必須匹配。
  • RequestPredicate.or(RequestPredicate) // 兩者都可以匹配。

RequestPredicates中的許多謂詞都是組合的。例如,RequestPredicates.GET(String)由RequestPredicates.method(HttpMethod)和RequestPredicates.path(String)組合而成。上面顯示的示例還使用了兩個(gè)請(qǐng)求謂詞,因?yàn)闃?gòu)建器使用RequestPredicates.GET內(nèi)部,并用accept謂詞組合它。

路由Routes

路由器函數(shù)按順序計(jì)算:如果第一個(gè)路由不匹配,則計(jì)算第二個(gè)路由,依此類推。因此,在一般路由之前聲明更具體的路由是有意義的。這在將路由器函數(shù)注冊(cè)為Spring bean時(shí)也很重要,稍后將對(duì)此進(jìn)行描述。注意,此行為不同于基于注釋的編程模型,后者自動(dòng)選擇“最特定的”控制器方法。

當(dāng)使用路由器函數(shù)構(gòu)建器時(shí),所有定義的路由被組合到一個(gè)RouterFunction中,該RouterFunction從build()返回。還有其他方法可以將多個(gè)路由器功能組合在一起:

  • add(RouterFunction) on the RouterFunctions.route() builder。
  • RouterFunction.and(RouterFunction)。
  • RouterFunction.andRoute(RequestPredicate, HandlerFunction)?—?shortcut for RouterFunction.and() with nested RouterFunctions.route()。

下面的例子展示了四條路由的組合:

import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.web.reactive.function.server.RequestPredicates.*;
PersonRepository repository = ...
PersonHandler handler = new PersonHandler(repository);
RouterFunction<ServerResponse> otherRoute = ...
RouterFunction<ServerResponse> route = route()
.GET("/person/{id}", accept(APPLICATION_JSON), handler::getPerson) // 1
.GET("/person", accept(APPLICATION_JSON), handler::listPeople) // 2
.POST("/person", handler::createPerson) // 3
.add(otherRoute) // 4
.build();
  1. 帶有匹配JSON的Accept頭的GET /person/{id}被路由到PersonHandler.getPerson。
  2. 帶有與JSON匹配的Accept頭的GET /person被路由到PersonHandler.listPeople。
  3. 沒有附加謂詞的POST /person被映射到PersonHandler.createPerson。
  4. otherRoute是一個(gè)在別處創(chuàng)建的路由器函數(shù),并添加到構(gòu)建的路由中。

嵌套路由Nested Routes

一組路由器函數(shù)通常具有一個(gè)共享謂詞,例如共享路徑。在上面的示例中,共享謂詞將是一個(gè)與/person匹配的路徑謂詞,由三條路由使用。在使用注釋時(shí),可以通過(guò)使用映射到/person的類型級(jí)@RequestMapping注釋來(lái)消除這種重復(fù)。在WebFlux.Fn,路徑謂詞可以通過(guò)路由器函數(shù)構(gòu)建器上的路徑方法共享。例如,上面例子的最后幾行可以通過(guò)使用嵌套路由通過(guò)以下方式進(jìn)行改進(jìn):

RouterFunction<ServerResponse> route = route()
.path("/person", builder -> builder // 1
.GET("/{id}", accept(APPLICATION_JSON), handler::getPerson)
.GET(accept(APPLICATION_JSON), handler::listPeople)
.POST(handler::createPerson))
.build();

注意:path的第二個(gè)參數(shù)是接受路由器構(gòu)建器的消費(fèi)者。

盡管基于路徑的嵌套是最常見的,但是你可以通過(guò)在構(gòu)建器上使用嵌套方法來(lái)嵌套任何類型的謂詞。上面的內(nèi)容仍然以共享的Accept-header謂詞的形式包含了一些重復(fù)。我們可以通過(guò)使用nest方法和accept來(lái)進(jìn)一步改進(jìn):

RouterFunction<ServerResponse> route = route()
.path("/person", b1 -> b1
.nest(accept(APPLICATION_JSON), b2 -> b2
.GET("/{id}", handler::getPerson)
.GET(handler::listPeople))
.POST(handler::createPerson))
.build();

總結(jié):

  1. 路由函數(shù)中RouteFunction的使用。
  2. 嵌套路由的使用。
責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2022-09-22 08:19:26

WebFlux函數(shù)式編程

2021-07-28 20:13:04

響應(yīng)式編程

2022-07-04 09:15:10

Spring請(qǐng)求處理流程

2023-02-09 08:01:12

核心組件非阻塞

2013-09-09 09:41:34

2023-09-21 08:01:27

SpringR2DBC實(shí)現(xiàn)數(shù)據(jù)庫(kù)

2023-09-04 11:52:53

SpringMVC性能

2015-09-28 14:54:08

Java函數(shù)式編程

2018-11-15 10:20:59

Python函數(shù)式編程編程語(yǔ)言

2016-10-31 20:46:22

函數(shù)式編程Javascript

2011-03-08 15:47:32

函數(shù)式編程

2020-09-24 10:57:12

編程函數(shù)式前端

2025-03-11 10:00:20

Golang編程函數(shù)

2022-11-04 08:39:46

SpringWebFlux

2011-08-24 09:13:40

編程

2023-12-14 15:31:43

函數(shù)式編程python編程

2020-12-09 08:21:47

編程Exchanger工具

2017-06-08 14:25:46

Kotlin函數(shù)

2020-12-03 11:15:21

CyclicBarri

2019-01-17 10:25:56

Python編程語(yǔ)言程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久国产精品色av免费观看 | 老头搡老女人毛片视频在线看 | 国产视频线观看永久免费 | 久久综合亚洲 | 日本黄色大片免费看 | 性国产丰满麻豆videosex | 国产精品69毛片高清亚洲 | 亚洲精品国产第一综合99久久 | 激情五月婷婷 | 亚洲一区二区久久 | 99精品一区 | 一区二区在线免费观看 | 欧美精品久久 | 久久久久久亚洲国产精品 | 五月天综合网 | 日韩免费一区二区 | 精品国产99| 国产午夜精品福利 | 亚洲一区在线观看视频 | 久久久激情视频 | 伊人91在线| 国产精品九九 | 亚洲视频免费 | 欧美一区二区 | 免费播放一级片 | 亚洲视频 欧美视频 | 久久日本 | 国产精品视频久久 | 精品视频在线一区 | 国产麻豆乱码精品一区二区三区 | 成人av播放 | 古装人性做爰av网站 | 99精品免费视频 | 成人欧美一区二区三区白人 | 综合二区| 国产成人精品综合 | 玖操| 国产一区视频在线 | 在线只有精品 | 一区二区三区不卡视频 | 国内精品视频在线观看 |