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
- 譯文——OkHttp, 安卓和Java應用的HTTP&HTTP2.0客戶端HTTP安卓Java客戶端
- Java HTTP 客戶端的比較 - reflectoringJavaHTTP客戶端
- Gofer是Node.js 的HTTP客戶端GoNode.jsHTTP客戶端
- HTTP客戶端框架之RetrofitHTTP客戶端框架
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- 搭建本地server,響應Android客戶端HTTP請求ServerAndroid客戶端HTTP
- reqwest:簡單而強大的 Rust HTTP 客戶端RustHTTP客戶端
- Spring Cloud Stream的函式式和響應式Reactive程式設計特點 - spring.ioSpringCloud函式React程式設計
- 高效能 HTTP 客戶端 undici 初探HTTP客戶端
- Spring Boot OAuth 2.0 客戶端Spring BootOAuth客戶端
- Spring Cloud構建客戶端SpringCloud客戶端
- 【新特性速遞】表格的客戶端合計客戶端
- 分散式配置中心客戶端分散式客戶端
- Asp .Net Core 系列:整合 Refit 和 RestEase 宣告式 HTTP 客戶端庫RESTHTTP客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- 5. Spring Cloud OpenFeign 宣告式 WebService 客戶端的超詳細使用SpringCloudWeb客戶端
- MQTTJava客戶端的使用MQQTJava客戶端
- redis客戶端的使用Redis客戶端
- 《samba搭建win客戶端和linux客戶端的區別》Samba客戶端Linux
- Spring Cloud實戰系列(三) - 宣告式客戶端呼叫FeignSpringCloud客戶端
- WCF 客戶端 BasicHttpBinding 相容 HTTPS 和 HTTP客戶端HTTP
- 修改CAS客戶端 使用簡單HTTP協議客戶端HTTP協議
- IE客戶客戶端程式開發的利器Bindows客戶端
- 手擼一個新聞客戶端客戶端
- gout 新版本釋出,golang實現的http 流式客戶端GolangHTTP客戶端
- HTTPie:替代 Curl 和 Wget 的現代 HTTP 命令列客戶端HTTPwget命令列客戶端
- Spring Cloud Config客戶端使用SpringCloud客戶端
- Spring Cloud Config—客戶端使用SpringCloud客戶端
- Elasticsearch的PHP客戶端操作ElasticsearchPHP客戶端
- Python socket的客戶端Python客戶端
- zookeeper的Java客戶端APIJava客戶端API
- Ceph的客戶端安裝客戶端
- 解析RocketMQ的client客戶端MQclient客戶端
- HTTP客戶端連線,選擇HttpClient還是OkHttp?HTTP客戶端client