ServerWebExchange
是 Spring WebFlux 中的一個核心接口,用于表示服務器端處理的 HTTP 請求和響應。它封裝了請求和響應的所有信息,并提供了相應的方法來操作這些信息。ServerWebExchange
在響應式編程模型中扮演著關鍵角色,支持非阻塞、異步的操作方式。
主要功能
-
請求信息:
ServerWebExchange
提供了對 HTTP 請求的訪問方法,包括請求頭(Headers)、請求參數(Query Parameters)、請求路徑(Path)、請求體(Body)等。- 示例:獲取請求頭中的某個字段值。
String headerValue = exchange.getRequest().getHeaders().getFirst("Header-Name");
-
響應信息:
- 同樣地,
ServerWebExchange
也允許你操作 HTTP 響應,如設置狀態碼、添加響應頭、寫入響應體等。 - 示例:設置響應的狀態碼并完成響應。
exchange.getResponse().setStatusCode(HttpStatus.OK); return exchange.getResponse().setComplete();
- 同樣地,
-
屬性管理:
- 可以通過
ServerWebExchange
設置和獲取屬性(Attributes),這在過濾器鏈之間傳遞數據時非常有用。 - 示例:設置一個屬性。
ServerWebExchange newExchange = exchange.mutate().attribute("key", "value").build();
- 可以通過
-
請求修改:
- 使用
mutate()
方法可以創建一個現有請求的副本,并對其進行修改而不影響原始請求。 - 示例:修改請求頭后構建新的請求。
ServerHttpRequest modifiedRequest = exchange.getRequest().mutate().header("New-Header", "HeaderValue").build(); ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();
- 使用
-
響應完成:
- 當處理完請求后,使用
exchange.getResponse().setComplete()
來標志響應結束。 - 這是告訴 WebFlux 引擎當前的響應已經準備好發送給客戶端。
- 當處理完請求后,使用
應用場景
-
過濾器:
- 在實現自定義的
WebFilter
時,ServerWebExchange
被用來攔截和處理請求和響應。 - 示例:在一個簡單的日志記錄過濾器中打印請求路徑。
@Component public class LoggingFilter implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {System.out.println("Handling request to path: " + exchange.getRequest().getPath());return chain.filter(exchange);} }
- 在實現自定義的
-
路由和轉發:
ServerWebExchange
可以用于在不同的服務或路由間轉發請求。
-
異常處理:
- 結合
ServerWebExchange
,可以在網關層統一處理異常并返回適當的錯誤響應。
- 結合
總結
ServerWebExchange
是 Spring WebFlux 中非常重要的接口,它為開發者提供了一種強大而靈活的方式來處理 HTTP 請求和響應。無論是構建微服務架構中的網關應用,還是開發需要高度定制化HTTP處理邏輯的應用程序,理解和正確使用 ServerWebExchange
都是非常必要的。它不僅簡化了異步非阻塞編程模型下的HTTP處理流程,還促進了代碼的清晰度和可維護性。