精华内容
下载资源
问答
  • WebClient使用

    2021-05-04 18:18:14
  • WEBCLIENT使用方法

    2013-11-06 17:04:11
    WEBCLIENT使用方法
  • 本篇文章主要介绍了spring 5 webclient使用指南详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Spring的WebClient使用

    2020-12-29 19:51:42
    WebClient使用 引言 Spring Framework 5 包括一个新的 spring-webflux 模块。该模块包含对响应式 HTTP 和 WebSocket 客户端的支持,以及对REST,HTML浏览器和 WebSocket风格交互的响应式服务器Web应用程序的支持。...

    WebClient使用

    引言

    Spring Framework 5 包括一个新的 spring-webflux 模块。该模块包含对响应式 HTTP 和 WebSocket 客户端的支持,以及对REST,HTML浏览器和 WebSocket风格交互的响应式服务器Web应用程序的支持。本文主要介绍WebClient的使用,包括通过WebClient请求接口及实现接口的文件上传下载。

    1.引入依赖

    在pom.xml中引入WebClient所需的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectreactor</groupId>
        <artifactId>reactor-spring</artifactId>
        <version>1.0.1.RELEASE</version>
    </dependency>
    

    2.一个简单的请求示例

    请求百度首页示例

    // 1.创建WebClient实例
    WebClient webClient = WebClient
                    .builder()
                    .baseUrl("https://www.baidu.com")
                    .build();
    
    // 2.通过通过retrieve()请求并获得响应
    Mono<String> bodyToMono = webClient
                    .get()
                    .retrieve()
                    // 将请求结果处理为String类型
                    .bodyToMono(String.class);
    
    log.info("请求返回的数据内容:{}", bodyToMono.block());
    

    3.WebClient配置

    在创建WebClient时可对一些变量进行默认设置

    WebClient client3 = WebClient
      .builder()
        .baseUrl("http://localhost:8080")
        .defaultCookie("cookieKey", "cookieValue")
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) 
        .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080"))
      .build();
    

    也可在发起请求时填入cookie、header等参数

    webClient
      .get()
      .uri("https://www.baidu.com")
      .cookie("cookieKey", "cookieValue")
      .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
      .retrieve();
    

    4.在请求中传参

    在日常使用中传递参数的方法

    WebClient webClient = WebClient.create();
    Mono<String> bodyToMono = webClient.post()
      .uri(uriBuilder ->
           uriBuilder
           .scheme("https")
           .host("localhost:8080")
           .path("/api/test")
           .queryParam("id", "123")
           .queryParam("invalid", "invalid123")
           .build()
          )
      // requestbody,也可以使用MultiValueMap<String, String> map = new LinkedMultiValueMap<>(),传入参数,发起form提交。或直接使用HashMap传参
      .syncBody(new Student())
      .retrieve()
      .bodyToMono(String.class);
    

    5.设置连接超时时间

    设置请求超时时间

    TcpClient tcpClient = TcpClient
                  .create()
                  .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
                  .doOnConnected(connection -> {
    	connection.addHandlerLast(new ReadTimeoutHandler(5000, TimeUnit.MILLISECONDS));
    	connection.addHandlerLast(new WriteTimeoutHandler(5000, TimeUnit.MILLISECONDS));
                    });
    
    WebClient client = WebClient.builder()
                    .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
                    .build();
    

    6.文件上传

    上传文件代码

    HttpHeaders headers = new HttpHeaders();
    headers.add("content-type", "application/x-www-form-urlencoded");
    HttpEntity<ClassPathResource> entity = new HttpEntity<>(new ClassPathResource("a.txt"), headers);
    MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
    parts.add("file", entity);
    Mono<String> bodyToMono = WebClient.create().post()
            .uri("http://localhost:8080/upload")
            .contentType(MediaType.MULTIPART_FORM_DATA)
            .body(BodyInserters.fromMultipartData(parts))
            .retrieve().bodyToMono(String.class);
    

    7.文件下载

    通过将.retrieve()方法换成.exchange(),可以获取到响应的头信息、Cookie等信息,与restTemplate相似。

    Mono<ClientResponse> responseMono = WebClient.create().get()
                    .uri("http://localhost:8080/file/download")
                    .accept(MediaType.APPLICATION_OCTET_STREAM)
                    .exchange(); 
    ClientResponse response = responseMono.block();
    // 可从headers中获取filename等信息 
    ClientResponse.Headers headers = response.headers();
    Resource resource = response.bodyToMono(Resource.class).block();
    // 获取文件流
    InputStream inputStream = resource.getInputStream();
    

    8.WebTestClient

    The WebTestClient is the main entry point for testing WebFlux server endpoints. It has a very similar API to the WebClient, and it delegates most of the work to an internal WebClient instance focusing mainly on providing a test context. The DefaultWebTestClient class is a
    single interface implementation.

    主要意思是WebTestClient用于测试WebFlux服务器端点,他和WebClient相似,且将大部分工作委托给了内部的WebClient,主要用于测试上下文,此部分后期在单独整理。

    展开全文
  • 主要给大家介绍了关于Spring5中WebClient使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring5具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • spring 5 webclient使用指南-转

    千次阅读 2019-06-21 20:11:56
    spring 5 webclient使用指南 序 之前写了一篇restTemplate使用实例,由于spring 5全面引入reactive,同时也有了restTemplate的reactive版webclient,本文就来对应展示下webclient的基本使用。 请求携带header ...

    spring 5 webclient使用指南

    之前写了一篇restTemplate使用实例,由于spring 5全面引入reactive,同时也有了restTemplate的reactive版webclient,本文就来对应展示下webclient的基本使用。

    请求携带header

    • 携带cookie
        @Test
        public void testWithCookie(){
            Mono<String> resp = WebClient.create()
                    .method(HttpMethod.GET)
                    .uri("http://baidu.com")
                    .cookie("token","xxxx")
                    .cookie("JSESSIONID","XXXX")
                    .retrieve()
                    .bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }
    • 携带basic auth
        @Test
        public void testWithBasicAuth(){
            String basicAuth = "Basic "+ Base64.getEncoder().encodeToString("user:pwd".getBytes(StandardCharsets.UTF_8));
            LOGGER.info(basicAuth);
            Mono<String> resp = WebClient.create()
                    .get()
                    .uri("http://baidu.com")
                    .header(HttpHeaders.AUTHORIZATION,basicAuth)
                    .retrieve()
                    .bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }
    • 设置全局user-agent
        @Test
        public void testWithHeaderFilter(){
            WebClient webClient = WebClient.builder()
                    .defaultHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
                    .filter(ExchangeFilterFunctions
                            .basicAuthentication("user","password"))
                    .filter((clientRequest, next) -> {
                        LOGGER.info("Request: {} {}", clientRequest.method(), clientRequest.url());
                        clientRequest.headers()
                                .forEach((name, values) -> values.forEach(value -> LOGGER.info("{}={}", name, value)));
                        return next.exchange(clientRequest);
                    })
                    .build();
            Mono<String> resp = webClient.get()
                    .uri("https://baidu.com")
                    .retrieve()
                    .bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }

    get请求

    • 使用placeholder传递参数
        @Test
        public void testUrlPlaceholder(){
            Mono<String> resp = WebClient.create()
                    .get()
                    //多个参数也可以直接放到map中,参数名与placeholder对应上即可
                    .uri("http://www.baidu.com/s?wd={key}&other={another}","北京天气","test") //使用占位符
                    .retrieve()
                    .bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
    
        }
    • 使用uriBuilder传递参数
        @Test
        public void testUrlBiulder(){
            Mono<String> resp = WebClient.create()
                    .get()
                    .uri(uriBuilder -> uriBuilder
                            .scheme("http")
                            .host("www.baidu.com")
                            .path("/s")
                            .queryParam("wd", "北京天气")
                            .queryParam("other", "test")
                            .build())
                    .retrieve()
                    .bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }

    post表单

        @Test
        public void testFormParam(){
            MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
            formData.add("name1","value1");
            formData.add("name2","value2");
            Mono<String> resp = WebClient.create().post()
                    .uri("http://www.w3school.com.cn/test/demo_form.asp")
                    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                    .body(BodyInserters.fromFormData(formData))
                    .retrieve().bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }

    post json

    • 使用bean来post
    static class Book {
            String name;
            String title;
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public String getTitle() {
                return title;
            }
    
            public void setTitle(String title) {
                this.title = title;
            }
        }
    
        @Test
        public void testPostJson(){
            Book book = new Book();
            book.setName("name");
            book.setTitle("this is title");
            Mono<String> resp = WebClient.create().post()
                    .uri("http://localhost:8080/demo/json")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .body(Mono.just(book),Book.class)
                    .retrieve().bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }
    • 直接post raw json
        @Test
        public void testPostRawJson(){
            Mono<String> resp = WebClient.create().post()
                    .uri("http://localhost:8080/demo/json")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .body(BodyInserters.fromObject("{\n" +
                            "  \"title\" : \"this is title\",\n" +
                            "  \"author\" : \"this is author\"\n" +
                            "}"))
                    .retrieve().bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }

    post二进制--上传文件

        @Test
        public void testUploadFile(){
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.IMAGE_PNG);
            HttpEntity<ClassPathResource> entity = new HttpEntity<>(new ClassPathResource("parallel.png"), headers);
            MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
            parts.add("file", entity);
            Mono<String> resp = WebClient.create().post()
                    .uri("http://localhost:8080/upload")
                    .contentType(MediaType.MULTIPART_FORM_DATA)
                    .body(BodyInserters.fromMultipartData(parts))
                    .retrieve().bodyToMono(String.class);
            LOGGER.info("result:{}",resp.block());
        }

    下载二进制

    • 下载图片
        @Test
        public void testDownloadImage() throws IOException {
            Mono<Resource> resp = WebClient.create().get()
                    .uri("http://www.toolip.gr/captcha?complexity=99&size=60&length=9")
                    .accept(MediaType.IMAGE_PNG)
                    .retrieve().bodyToMono(Resource.class);
            Resource resource = resp.block();
            BufferedImage bufferedImage = ImageIO.read(resource.getInputStream());
            ImageIO.write(bufferedImage, "png", new File("captcha.png"));
    
        }
    • 下载文件
        @Test
        public void testDownloadFile() throws IOException {
            Mono<ClientResponse> resp = WebClient.create().get()
                    .uri("http://localhost:8080/file/download")
                    .accept(MediaType.APPLICATION_OCTET_STREAM)
                    .exchange();
            ClientResponse response = resp.block();
            String disposition = response.headers().asHttpHeaders().getFirst(HttpHeaders.CONTENT_DISPOSITION);
            String fileName = disposition.substring(disposition.indexOf("=")+1);
            Resource resource = response.bodyToMono(Resource.class).block();
            File out = new File(fileName);
            FileUtils.copyInputStreamToFile(resource.getInputStream(),out);
            LOGGER.info(out.getAbsolutePath());
        }

    错误处理

        @Test
        public void testRetrieve4xx(){
            WebClient webClient = WebClient.builder()
                    .baseUrl("https://api.github.com")
                    .defaultHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.github.v3+json")
                    .defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient")
                    .build();
            WebClient.ResponseSpec responseSpec = webClient.method(HttpMethod.GET)
                    .uri("/user/repos?sort={sortField}&direction={sortDirection}",
                            "updated", "desc")
                    .retrieve();
            Mono<String> mono = responseSpec
                    .onStatus(e -> e.is4xxClientError(),resp -> {
                        LOGGER.error("error:{},msg:{}",resp.statusCode().value(),resp.statusCode().getReasonPhrase());
                        return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));
                    })
                    .bodyToMono(String.class)
                    .doOnError(WebClientResponseException.class, err -> {
                        LOGGER.info("ERROR status:{},msg:{}",err.getRawStatusCode(),err.getResponseBodyAsString());
                        throw new RuntimeException(err.getMessage());
                    })
                    .onErrorReturn("fallback");
            String result = mono.block();
            LOGGER.info("result:{}",result);
        }
    • 可以使用onStatus根据status code进行异常适配
    • 可以使用doOnError异常适配
    • 可以使用onErrorReturn返回默认值

    小结

    webclient是新一代的async rest template,api也相对简洁,而且是reactive的,非常值得使用。

    doc

    展开全文
  • WebClient使用DownloadDataCompleted异步下载图片
       
             
    
    //这里触发代码
                  using (WebClient wc = new WebClient())//防止内存泄漏
                    {
                        wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(DownloadDataCallback);
                        Uri uri = new Uri(“图片的下载地址”);
                        wc.DownloadDataAsync(uri);
                    }
    
    
    
    
    //异步的事件
         public void DownloadDataCallback(object sender, DownloadDataCompletedEventArgs e)
            {
                try
                {
                    if (e.Result.Length > 0 && e.Error == null && e.Cancelled == false)
                    {
                        byte[] buffer = e.Result;
                        using (MemoryStream ms = new MemoryStream(buffer))
                        {
                            Bitmap bitmap = new Bitmap(ms);//得到数据
                         //   pbMain.Image = bitmap;
                        }
                    }
                }
                catch
                {
                }
            }

    
    
    WebClient使用DownloadDataCompleted异步下载图片  比同步的好处就是  如果你的URL出现出错 同步会卡住程序  而异步不会  减少等待时间
    展开全文
  • webclient使用介绍

    千次阅读 2019-12-14 23:49:16
    webclient 和webflux(参考(webflux)) 这一系列,我们可以开好多节课程来讲解 什么是webclient,在spring5中,出现了reactive 响应式编程思想(参考响应式编程文章),并且为网络编程提供相关响应式编程的支持,...
  • WebClient 使用学习记录

    2021-06-02 15:37:15
    文章目录前言一、相关技术背景介绍二、IO相关知识点三、 WebClient使用3.1 引入依赖3.2 创建实例3.3 Get, Mono是WebClint返回的结果类型3.4 POST 普通形式3.5 POST 业务需求,参数通过读取文件获取,文件内容是...
  • spring 5 webclient使用指南 请求携带header 携带cookie @Test public void testWithCookie(){ Mono&lt;String&gt; resp = WebClient.create() .method(HttpMethod.GET) .uri("...
  • spring 5 webclient使用指南

    千次阅读 2019-06-13 10:39:33
    WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor... 下面是链接是讲解webclient使用指南,推荐一下,感兴趣的可以学习一下。...
  • C#中WebClient使用DownloadString中文乱码的解决办法 原文: C#中WebClient中文乱码的解决办法 第一次尝试: string question = textBox1.Text.ToString(); WebClientclient= new WebClient(); ...
  • springbootwebfluxwebclient使用说明
  • springbootwebfluxwebclient使用示例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,954
精华内容 781
关键字:

webclient使用