WebClient: Spring的新的HTTP反應式客戶端 - spring.io
今天,我們將研究一個多功能的,方便的,花哨的HTTP客戶端WebClient。
HTTP服務是常見的資料來源。Web是HTTP可伸縮性和彈性的存在證明,在構建網路服務時,它非常有力地證明了對HTTP約束(如REST)的吸引力。
有一些很棒的庫(例如Apache HttpComponents Client和OkHttp)以相同的方式工作。WebClient是在Spring Webflux中使用基於Netty的非阻塞HTTP客戶端.
WebClient是反應性的,無阻塞的,用來替代RestTemplate。因為它是非阻塞的:用於發出網路請求的客戶端執行緒不會結束通話以等待網路服務響應。這意味著更好的可伸縮性,它使用了Reactive Streams API,使編寫變得更加容易.WebClient可以與任何舊的HTTP端點進行通訊.
使用WebClient需要引入依賴:org.springframework.boot : spring-boot-starter-webflux
下面是WebClient程式碼演示的功能:
- 使用支援Spring Initializr的HTTP API初始化了一個新專案
- 它使用Spring API檢索所有活動的開源Spring專案
package bootiful.httpclient.webclient; import lombok.ToString; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.MediaType; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; import java.net.URI; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import static java.nio.file.StandardOpenOption.CREATE; @EnableAsync @SpringBootApplication public class BootifulApplication { public static void main(String[] args) { SpringApplication.run(BootifulApplication.class, args); } @Bean WebClient webClient(WebClient.Builder builder) { return builder// .filter(// (clientRequest, exchangeFunction) -> exchangeFunction// .exchange(clientRequest)// .doOnNext(response -> System.out.println("got a WebClient response: " + response))// ) // .build(); } @Bean ApplicationListener<ApplicationReadyEvent> ready(@Value("file://${user.home}/Desktop/output.zip") Path output, WebClient client) { return event -> { // initialize a new Spring Boot project .zip archive Mono<DataBuffer> db = client.get()// .uri(URI.create("https://start.spring.io/starter.zip"))// .accept(MediaType.APPLICATION_OCTET_STREAM)// .retrieve()// .bodyToMono(DataBuffer.class); // gets written out to ~/output.zip Mono<Boolean> write = DataBufferUtils.write(db, output, CREATE).thenReturn(true); // enumerate all the active Spring projects using the // JSON API while we're at it... Mono<ProjectsResponse> json = client// .get()// .uri(URI.create("https://spring.io/api/projects"))// .retrieve()// .bodyToMono(ProjectsResponse.class); // look ma! No threading code! this will launch both network // calls (the .zip and the json) at the same time Mono.zip(write, json).subscribe(tuple -> enumerate(tuple.getT2())); }; } private void enumerate(ProjectsResponse pr) { pr._embedded // .projects // .stream() // .filter(p -> p.status.equalsIgnoreCase("active")) // .forEach(project -> System.out.println(project.toString())); } } @ToString class ProjectsResponse { public Embedded _embedded = new Embedded(); @ToString public static class Project { public String name, slug, status, repositoryUrl; } @ToString public static class Embedded { public Collection<Project> projects = new ArrayList<>(); } } |
您想引入WebClient,但不想使用其餘的反應式Web堆疊,則需要告訴Spring Boot。否則,Spring Boot將嘗試建立基於Netty的Spring Webflux環境。
需要以下配置application.properties:
spring.main.web-application-type=none
相關文章
- Spring Boot響應式客戶端WebClient入門Spring Boot客戶端Webclient
- HTTP 客戶端:RestClient、WebClient、RestTemplateHTTP客戶端RESTclientWeb
- RetrofitJs – TypeScript實現的宣告式HTTP客戶端JSTypeScriptHTTP客戶端
- 使用Project Reactor進行反應式資料流 - spring.ioProjectReactSpring
- Java HTTP 客戶端的比較 - reflectoringJavaHTTP客戶端
- 譯文——OkHttp, 安卓和Java應用的HTTP&HTTP2.0客戶端HTTP安卓Java客戶端
- HTTP客戶端框架之RetrofitHTTP客戶端框架
- Spring Cloud Stream的函式式和響應式Reactive程式設計特點 - spring.ioSpringCloud函式React程式設計
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- reqwest:簡單而強大的 Rust HTTP 客戶端RustHTTP客戶端
- Spring Boot OAuth 2.0 客戶端Spring BootOAuth客戶端
- Spring Cloud Config客戶端使用SpringCloud客戶端
- 5. Spring Cloud OpenFeign 宣告式 WebService 客戶端的超詳細使用SpringCloudWeb客戶端
- 高效能 HTTP 客戶端 undici 初探HTTP客戶端
- Spring Cloud實戰系列(三) - 宣告式客戶端呼叫FeignSpringCloud客戶端
- Asp .Net Core 系列:整合 Refit 和 RestEase 宣告式 HTTP 客戶端庫RESTHTTP客戶端
- 【新特性速遞】表格的客戶端合計客戶端
- 分散式配置中心客戶端分散式客戶端
- HTTPie:替代 Curl 和 Wget 的現代 HTTP 命令列客戶端HTTPwget命令列客戶端
- Python socket的客戶端Python客戶端
- spring系列—CAS客戶端與SpringSecurity整合Spring客戶端Gse
- Spring Cloud Ribbon 客戶端負載均衡SpringCloud客戶端負載
- Spring Cloud Netflix—自定義Ribbon客戶端SpringCloud客戶端
- gout 新版本釋出,golang實現的http 流式客戶端GolangHTTP客戶端
- easyhttp——輕量級、語義化、 對 IDE 友好的 HTTP 客戶端HTTPIDE客戶端
- SpringBoot中HTTP高效能客戶端實現Spring BootHTTP客戶端
- Aiohttp是Python的最快的非同步HTTP客戶端/伺服器庫包AIHTTPPython非同步客戶端伺服器
- 更快更省:帶有新AOT引擎的Spring Native 0.11 釋出 - spring.ioSpring
- Spring專案如何優雅的生成介面文件與客戶端Spring客戶端
- Spring Cloud Netflix—斷路器:Hystrix客戶端SpringCloud客戶端
- Spring Cloud Netflix—宣告性REST客戶端:FeignSpringCloudREST客戶端
- spring boot 獲取客戶端ip資訊Spring Boot客戶端
- zookeeper的Java客戶端APIJava客戶端API
- Elasticsearch的PHP客戶端操作ElasticsearchPHP客戶端
- 基於Dtm分散式事務管理的php客戶端分散式PHP客戶端
- Golang 學習筆記(一) - HTTP 客戶端 - 基礎Golang筆記HTTP客戶端
- HTTP客戶端連線,選擇HttpClient還是OkHttp?HTTP客戶端client
- Java HTTP/2 客戶端:從阻塞到非同步 - sanjeevrJavaHTTP客戶端非同步VR