带有ssl的spring webclient抛出NPE

问题描述

我想创建一个普通的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使用净值,而不是码头。然后样本起作用