欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn)

 更新時間:2023年08月21日 09:12:13   作者:魚找水需要時間  
本文主要介紹了SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn),文章詳細闡述了如何使用SpringBoot3的網(wǎng)絡(luò)請求客戶端進行HTTP請求和處理響應(yīng),并提供了示例代碼和說明,具有一定的參考價值,感興趣的可以了解一下

SpringBoot是一個基于Spring的快速開發(fā)框架,它可以幫助我們快速構(gòu)建、部署和運行Java應(yīng)用程序。HTTP接口是Web應(yīng)用程序與外部系統(tǒng)進行通信的一種方式,通過HTTP協(xié)議,我們可以實現(xiàn)客戶端與服務(wù)器之間的數(shù)據(jù)交互。

SpringBoot 整合提供了很多方式進行遠程調(diào)用

  • 輕量級客戶端方式
    • RestTemplate: 普通開發(fā)
    • WebClient: 響應(yīng)式編程開發(fā)
    • Http Interface: 聲明式編程

在 Spring WebFlux 中,Mono 和 Flux 都是響應(yīng)式編程的工具,用于處理異步數(shù)據(jù)流。

Mono: 是一個單例的、不可變的、最終的、完成的、包含單個元素的數(shù)據(jù)流,它只能發(fā)出一個元素。

Flux: 是一個可變的、無限的、最終的、未完成的數(shù)據(jù)流,它可以發(fā)出任意數(shù)量的元素。

聲明式客戶端

聲明式 http 客戶端主旨是使得編寫 java http 客戶端更容易。為了貫徹這個理念,采用了通過處理注解來自動生成請求的方式(官方稱呼為聲明式、模板化)。通過聲明式 http 客戶端實現(xiàn)我們就可以在 java 中像調(diào)用一個本地方法一樣完成一次 http 請求,大大減少了編碼成本,同時提高了代碼可讀性。

測試環(huán)境

SpringBoot3.0.6,JDK17

1. WebClient

WebClient 是Spring WebFlux 模塊提供的一個非阻塞的基于響應(yīng)式編程的進行 Http 請求的客戶端工具。完全非阻塞,支持流式處理。

1.1 創(chuàng)建與配置

發(fā)請求:

  • 請求方式: GET\POST\DELETE…
  • 請求路徑: /…
  • 請求參數(shù):aa=bb&cc=dd&xxx
  • 請求頭: aa=bb,cc=ddd
  • 請求體:
    創(chuàng)建WebClient:
  • WebClient.create()
  • WebClient.create(String baseUrl)使用WebClient.builder() 配置更多參數(shù):
  • uriBuilderFactory: 自定義UriBuilderFactory ,定義 baseurl.
  • defaultUriVariables: 默認 uri 變量.
  • defaultHeader: 每個請求默認頭.
  • defaultCookie: 每個請求默認 cookie.
  • defaultRequest: Consumer 自定義每個請求.
  • filter: 過濾 client 發(fā)送的每個請求
  • exchangeStrategies: HTTP 消息 reader/writer 自定義.
  • clientConnector: HTTP client 庫設(shè)置.

pom依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
WebClient webClient = WebClient.create("https://api.qqsuu.cn");

1.2 獲取響應(yīng)

retrieve()方法用來聲明如何提取響應(yīng)數(shù)據(jù)。比如

//獲取響應(yīng)完整信息
WebClient client = WebClient.create("https://example.org");
Mono<ResponseEntity<Person>> result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .toEntity(Person.class);
//只獲取body
WebClient client = WebClient.create("https://example.org");
Mono<Person> result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToMono(Person.class);
//stream數(shù)據(jù)
Flux<Quote> result = client.get()
        .uri("/quotes").accept(MediaType.TEXT_EVENT_STREAM)
        .retrieve()
        .bodyToFlux(Quote.class);
//定義錯誤處理
Mono<Person> result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .onStatus(HttpStatus::is4xxClientError, response -> ...)
        .onStatus(HttpStatus::is5xxServerError, response -> ...)
        .bodyToMono(Person.class);

1.3 定義請求體

//1、響應(yīng)式-單個數(shù)據(jù)
Mono<Person> personMono = ... ;
Mono<Void> result = client.post()
        .uri("/persons/{id}", id)
        .contentType(MediaType.APPLICATION_JSON)
        .body(personMono, Person.class)
        .retrieve()
        .bodyToMono(Void.class);
//2、響應(yīng)式-多個數(shù)據(jù)
Flux<Person> personFlux = ... ;
Mono<Void> result = client.post()
        .uri("/persons/{id}", id)
        .contentType(MediaType.APPLICATION_STREAM_JSON)
        .body(personFlux, Person.class)
        .retrieve()
        .bodyToMono(Void.class);
//3、普通對象
Person person = ... ;
Mono<Void> result = client.post()
        .uri("/persons/{id}", id)
        .contentType(MediaType.APPLICATION_JSON)
        .bodyValue(person)
        .retrieve()
        .bodyToMono(Void.class);

2. HTTP Interface

從 Spring 6 和 Spring Boot 3 開始,Spring 框架支持將遠程 HTTP 服務(wù)代理成帶有特定注解的 Java http interface。類似的庫,如 OpenFeign 和 Retrofit 仍然可以使用,但 http interface 為 Spring 框架添加內(nèi)置支持。

HTTP Interface可以將 HTTP 服務(wù)定義成一個包含特定注解標記的方法的 Java 接口,然后通過對接口方法的調(diào)用,完成 HTTP 請求。

2.1 定義接口

public interface BingService {
    @GetExchange(url = "/search")
    String search(@RequestParam("keyword") String keyword);
}

2.2 創(chuàng)建代理&測試

@SpringBootTest
class Boot05TaskApplicationTests {
    @Test
    void contextLoads() throws InterruptedException {
        //1、創(chuàng)建客戶端
        WebClient client = WebClient.builder()
                .baseUrl("https://cn.bing.com")
                .codecs(clientCodecConfigurer -> {
                    clientCodecConfigurer
                            .defaultCodecs()
                            .maxInMemorySize(256*1024*1024);
                            //響應(yīng)數(shù)據(jù)量太大有可能會超出BufferSize,所以這里設(shè)置的大一點
                })
                .build();
        //2、創(chuàng)建工廠
        HttpServiceProxyFactory factory = HttpServiceProxyFactory
                .builder(WebClientAdapter.forClient(client)).build();
        //3、獲取代理對象
        BingService bingService = factory.createClient(BingService.class);
        //4、測試調(diào)用
        Mono<String> search = bingService.search("chatgpt是什么");
        System.out.println("==========");
        //return search;
        search.subscribe(str -> System.out.println(str));
        Thread.sleep(100000);
    }
}

到此這篇關(guān)于SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot3 網(wǎng)絡(luò)請求客戶端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中數(shù)組的定義與使用

    Java中數(shù)組的定義與使用

    下面小編就為大家?guī)硪黄猨ava中數(shù)組的定義與使用小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • Java簡單計算圓周率完整示例

    Java簡單計算圓周率完整示例

    這篇文章主要介紹了Java簡單計算圓周率,結(jié)合完整實例形式分析了Java計算圓周率的原理與操作技巧,代碼備有較為詳盡的注釋便于理解,需要的朋友可以參考下
    2018-05-05
  • WeakHashMap的使用方法詳解

    WeakHashMap的使用方法詳解

    這篇文章主要介紹了WeakHashMap的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • java實現(xiàn)單人版五子棋游戲

    java實現(xiàn)單人版五子棋游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)五子棋小游戲的相關(guān)資料,十分簡單實用,有不錯的參考借鑒價值,推薦給大家,需要的朋友可以參考下
    2016-02-02
  • SpringBoot中必須掌握的常用注解小結(jié)

    SpringBoot中必須掌握的常用注解小結(jié)

    Spring?Boot?提供了大量的注解,用于簡化配置和加速程序開發(fā),這篇文章主要來和大家Spring?Boot中的常用注解的具體使用,希望對大家有所幫助
    2024-11-11
  • java啟動jar包修改JVM默認內(nèi)存問題

    java啟動jar包修改JVM默認內(nèi)存問題

    這篇文章主要介紹了java啟動jar包修改JVM默認內(nèi)存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java的堵塞隊列BlockingQueue詳解

    Java的堵塞隊列BlockingQueue詳解

    這篇文章主要介紹了Java的堵塞隊列BlockingQueue詳解,阻塞隊列常用于生產(chǎn)者和消費者的場景,生產(chǎn)者是向隊列里添加元素的線程,消費者是從隊列里取元素的線程,需要的朋友可以參考下
    2023-12-12
  • 一篇文章帶你了解Java容器,面板及四大布局管理器應(yīng)用

    一篇文章帶你了解Java容器,面板及四大布局管理器應(yīng)用

    這篇文章主要介紹了JAVA布局管理器與面板組合代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-08-08
  • springboot訪問請求404的原因及解決辦法

    springboot訪問請求404的原因及解決辦法

    在使用Spring Boot開發(fā)應(yīng)用程序時,有時可能會遇到訪問請求出現(xiàn)404錯誤的情況,即請求的資源未找到,這篇文章主要給大家介紹了關(guān)于springboot訪問請求404的原因及解決辦法,需要的朋友可以參考下
    2023-09-09
  • SpringBoot 并發(fā)登錄人數(shù)控制的實現(xiàn)方法

    SpringBoot 并發(fā)登錄人數(shù)控制的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot 并發(fā)登錄人數(shù)控制的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論