问题描述
我想创建一个普通的spring网络客户端来连续读取流。该流来自https页面。
我找到了一些“教程”,应该显示如何使用spring webclient来做到这一点,但事实并非如此。 它们要么已经过时,要么只是错误,或者缺少很多信息,尤其是有关所使用类的信息。
像HttpClient.create()之类的东西是PITA,却不知道要使用哪个确切的依赖项!
我当前的测试代码是这样:
package chatclient;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
public class SslWebClientTest {
public static void main(String[] args) {
try {
SslContext sslContext = SslContextBuilder
.forClient()
.build();
ReactorClientHttpConnector clientHttpConnector = new ReactorClientHttpConnector();
// HttpClient.create();
WebClient webClient = WebClient.builder()
.clientConnector(clientHttpConnector)
.build();
Flux<String> stringFlux = webClient
.get()
.uri("https://www.google.com")
.retrieve()
.bodyToFlux(String.class);
stringFlux.subscribe(System.out::println);
} catch (Exception e) {
e.printstacktrace();
}
}
}
如预期的那样,它将引发NPE,因为我不知道如何使用此处提到的sslcontext创建httpclient.create()Spring WebClient - SSL configuration 因为我只是不知道这里使用了什么httpclient类-它不是来自以下一种:apache,jdk,jetty
解决方法
发现了问题,这是“固定”代码:
package chatclient;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import org.springframework.http.client.reactive.ClientHttpConnector;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.netty.http.client.HttpClient;
public class SslWebClientTest {
public static void main(String[] args) {
try {
SslContext sslContext = SslContextBuilder
.forClient()
.build();
HttpClient httpClient = HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
ClientHttpConnector httpConnector = new ReactorClientHttpConnector(httpClient);
WebClient webClient = WebClient.builder()
.clientConnector(httpConnector)
.build();
Flux<String> stringFlux = webClient
.get()
.uri("https://www.google.com")
.retrieve()
.bodyToFlux(String.class);
stringFlux.subscribe(System.out::println);
} catch (Exception e) {
e.printStackTrace();
}
}
}
它要求:
compile group: 'io.netty',name: 'netty-handler',version: '4.1.51.Final'
compile group: 'io.projectreactor.netty',name: 'reactor-netty',version: '0.9.11.RELEASE'
webclient使用净值,而不是码头。然后样本起作用