Spring WebClient 的 basic auth 使用

接上一篇 RestTemplate的basic auth使用;

在spring5后官方带来了WebClient,说是以后替代RestTemplate了,不知道真假哈,既然有了新东西,就研究一下使用方法呗,也同时做个备忘笔记。

老规矩,先上结果,后说问题:

import org.springframework.http.HttpHeaders;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
import java.util.Map;

public class WebClientRequest {

    private static WebClient webClient = WebClient.builder()
            .baseUrl("http://jsonplaceholder.typicode.com")
            .build();

    private static void getHttp() throws InterruptedException {

//同步阻塞处理
//返回单个对象的处理
        Mono<Map> result = webClient.get().uri("/posts/1").headers(headers -> headers.setBasicAuth("username", "password")).retrieve().bodyToMono(Map.class);
        System.out.println("result.block()>>>>>>>>>" + result.block().get("title"));

返回数组的处理 小数据量用Mono<List>没有问题,数据量大了就会出超出buffer的异常了
        Mono<List> result = webClient.get().uri("/posts").headers(headers -> headers.setBasicAuth("username", "password")).retrieve().bodyToMono(List.class);
        System.out.println("result.block()>>>>>>>>>" + ((Map)result.block().get(0)).get("title"));

返回数组的处理 数组还是推荐使用Flux来处理,不会出现超出buffer的问题
        Flux<Map> result = webClient.get().uri("/posts").headers(headers -> headers.setBasicAuth("username", "password")).retrieve().bodyToFlux(Map.class);
        System.out.println("result.block()>>>>>>>>>" + result.collectList().block().get(0).get("title"));

//异步非阻塞处理
//返回单个对象的处理
        Mono<Map> result = webClient.get().uri("/posts/1").headers(headers -> headers.setBasicAuth("username", "password")).retrieve().bodyToMono(Map.class);
        result.subscribe(System.out::println);

返回数组的处理
        Flux<Map> result = webClient.get().uri("/posts").headers(headers -> headers.setBasicAuth("username", "password")).retrieve().bodyToFlux(Map.class);
        result.subscribe(System.out::println);

        // 等待3秒,防止主进程结束看不到异步消息打印
        Thread.currentThread().sleep(3000);

    }


    public static void main(String[] args) throws InterruptedException {
        getHttp();

    }
}

WebClient也可以同步阻塞线程,也可以异步非阻塞线程,看大家具体使用情况了。这里主要说一下认证,我使用的方式应该是代码最简洁的官方方法了,但是仍然有人使用Base64.getEncoder(),那样代码就不够简洁了,如下就比较繁琐:

    public static void testWithBasicAuth() {
        String url = "http://XXXXXXXXXXXXXXXXXXXXXXXX";
        String basicAuth = "Basic " + Base64.getEncoder().encodeToString("username:password".getBytes(StandardCharsets.UTF_8));
        System.out.println(basicAuth);
        Mono<String> resp = WebClient.create().get().uri(url).header(HttpHeaders.AUTHORIZATION, basicAuth).retrieve().bodyToMono(String.class);
        System.out.println(resp.block());
    }

下面说说遇到的一个小问题,在测试时发生了异常,接口调用返回200,后续打印处理出错,说是Exceeded limit on max bytes to buffer : 262144,于是baidu查找原因,基本上都说增加缓存设置来解决。但是分析了一下数据后发现,接口给的数据是数组,我在接收后转成了Map,这就相当于把List转成Map,那肯定不行啊,于是更改代码,把接收后数据转成List就一切ok了。

这个小坑是我类型匹配没使用对,但是异常告诉我超出buffer缓存了,就不能直接告诉我类型转换不匹配吗,折腾了一下午。。。马虎不得啊!

	Suppressed: java.lang.Exception: #block terminated with an error
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
		at reactor.core.publisher.Mono.block(Mono.java:1703)
		at com.xuyang.datacenter.WebClientRequest.getHttp(WebClientRequest.java:62)
		at com.xuyang.datacenter.WebClientRequest.main(WebClientRequest.java:90)
Caused by: org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
	at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:98)
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	|_ checkpoint ⇢ Body from GET http://oa.risun.com/indishare/indinames.nsf/api/data/collections/name/vwDepByAllForOther_xm?keys=&_rt=201909231718&count=9999&keysexactmatch=true [DefaultClientResponse]
Stack trace:
		at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:98)
		at org.springframework.core.io.buffer.LimitedDataBufferList.updateCount(LimitedDataBufferList.java:91)
		at org.springframework.core.io.buffer.LimitedDataBufferList.add(LimitedDataBufferList.java:57)

参考网址:https://www.viralpatel.net/basic-authentication-spring-webclient/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
<h3>回答1:</h3><br/>WebClient是一个用于发送HTTP请求的类,可以通过它来访问HTTP接口。使用WebClient发送HTTP请求需要以下步骤: 1. 创建WebClient对象。 2. 设置请求的URL和请求方法(GET、POST等)。 3. 设置请求头信息(可选)。 4. 设置请求体(可选)。 5. 发送请求并获取响应。 6. 处理响应数据。 例如,以下代码演示了如何使用WebClient访问一个HTTP接口并获取响应: ``` WebClient client = new WebClient(); string url = "http://example.com/api"; string method = "POST"; string requestBody = "param1=value1&param2=value2"; client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); string response = client.UploadString(url, method, requestBody); Console.WriteLine(response); ``` 在这个例子中,我们创建了一个WebClient对象,设置了请求的URL和请求方法为POST,设置了请求体为"param1=value1&param2=value2",并设置了请求头信息为"Content-Type: application/x-www-form-urlencoded"。然后,我们使用UploadString方法发送请求并获取响应,最后将响应输出到控制台。 <h3>回答2:</h3><br/>WebClient是一个可以访问Http接口的常用方式,它是一个轻量级的HTTP客户端,功能比较强大,可以发送HTTP/HTTPS请求,支持GET、POST等主流的HTTP操作,并且可以方便地传递参数、设置请求头以及接收响应数据。 使用WebClient访问Http接口,通常需要以下几个步骤: 1. 创建WebClient对象 首先需要创建一个WebClient对象,可以通过无参构造函数创建一个默认的WebClient对象,也可以在创建时通过参数设置代理、超时时间以及证书等信息。 2. 设置请求头 接下来需要设置请求头,可以通过WebHeaderCollection类的Add方法添加需要的请求头信息,例如User-Agent、Accept等。 3. 设置请求参数 如果访问的接口需要传递参数,可以通过NameValueCollection类的Add方法添加需要的参数,例如查询参数或表单参数。 4. 发送请求 发送请求可以通过WebClient类提供的相关方法实现,例如DownloadString、UploadString等。这些方法可以根据需要设置响应编码方式、请求方式、请求内容以及响应类型等信息。 5. 处理响应 接收响应数据可以通过调用发送请求时返回的响应数据进行处理,可以将响应数据解析为字符串、字节数组、JSON对象等形式,根据需要进行相应的操作。 总的来说,使用WebClient访问Http接口是比较简单、方便的一种方式,但也需要注意一些常见的问题,例如Http连接超时、被墙被封禁等,需要及时处理,以保证程序能够正常运行。 <h3>回答3:</h3><br/>WebClient是.NET中提供的一种简便的HTTP请求方式,可以方便地向HTTP服务器发送请求,并获取HTTP服务器返回的响应结果。 在使用WebClient访问HTTP接口时,我们需要先通过WebClient实例创建HTTP请求,然后设置请求的URL、请求方法、请求头等信息,并可能附带请求参数和数据。接着,我们通过WebClient的UploadString、DownloadString等方法将请求发送到HTTP服务器,并获取HTTP服务器的响应结果。最后,我们可以根据HTTP服务器返回的数据进行相应的处理,例如解析JSON、XML等数据格式并将其使用WebClient还支持HTTP认证机制、代理设置、上传和下载文件、异步请求等功能。在实际应用中,我们可能需要根据不同的业务需求,使用不同的WebClient方法和参数进行HTTP请求,并处理不同的HTTP响应结果。 总的来说,WebClient是.NET中一个强大而方便的HTTP请求工具,可以帮助我们快速定制HTTP请求,并获取HTTP服务的响应数据,是我们进行客户端与服务端交互的常用工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

perliu

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值