ToB企服应用市场:ToB评测及商务社交产业平台

标题: WebClient HTTP 哀求问题处理模板(泛型相应、忽略 SSL 证书等) [打印本页]

作者: 半亩花草    时间: 2024-9-13 02:21
标题: WebClient HTTP 哀求问题处理模板(泛型相应、忽略 SSL 证书等)
一、哀求大数据

1、问题案例

(1)Server


  1. @GetMapping("/testBigData")
  2. public String testBigData() {
  3.     int targetSize = 1024 * 1024; // 1MB
  4.     StringBuilder sb = new StringBuilder(targetSize);
  5.     for (int i = 0; i < targetSize; i++)   sb.append('A');
  6.     String largeString = sb.toString();
  7.     return largeString;
  8. }
复制代码
(2)Client

  1. WebClient webClient = WebClient.create();
  2. Mono<String> response = webClient.get()
  3.         .uri("http://127.0.0.1:9999/test/testBigData")
  4.         .retrieve()
  5.         .bodyToMono(String.class);
  6. response.subscribe(result -> {
  7.     System.out.println("请求成功,结果长度为:" + result.length());
  8. }, throwable -> {
  9.     throwable.printStackTrace();
  10. });
复制代码

  1. org.springframework.web.reactive.function.client.WebClientResponseException: 200 OK from GET http://127.0.0.1:9999/test/testBigData
  2. Caused by: org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
复制代码
2、处理计谋


  1. int size = 2 * 1024 * 1024;
  2. ExchangeStrategies strategies = ExchangeStrategies.builder()
  3.         .codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(size))
  4.         .build();
  5. WebClient webClient = WebClient.builder()
  6.         .exchangeStrategies(strategies)
  7.         .build();
  8. Mono<String> response = webClient.get()
  9.         .uri("http://127.0.0.1:9999/test/testBigData")
  10.         .retrieve()
  11.         .bodyToMono(String.class);
  12. response.subscribe(result -> {
  13.     System.out.println("请求成功,结果长度为:" + result.length());
  14. }, throwable -> {
  15.     throwable.printStackTrace();
  16. });
复制代码

二、不使用缓冲区哀求图片

1、问题案例

(1)Server


  1. server:
  2.   port: 9999
  3. spring:
  4.   mvc:
  5.     static-path-pattern: /file/download/**
  6.   web:
  7.     resources:
  8.       static-locations: file:D:/fileUpload/
复制代码
(2)Client

  1. WebClient webClient = WebClient.create();
  2. Mono<byte[]> response = webClient.get()
  3.         .uri("http://127.0.0.1:9999/file/download/1.png")
  4.         .accept(MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG)
  5.         .retrieve()
  6.         .bodyToMono(byte[].class);
  7. response.subscribe(result -> {
  8.     System.out.println("请求成功");
  9.     if (result != null) System.out.println("result length is " + result.length);
  10. }, throwable -> {
  11.     throwable.printStackTrace();
  12. });
复制代码

  1. org.springframework.web.reactive.function.client.WebClientResponseException: 200 OK from GET http://127.0.0.1:9999/file/download/1.png
  2. Caused by: org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
复制代码
2、处理计谋


  1. int size = 10 * 1024 * 1024;
  2. ExchangeStrategies strategies = ExchangeStrategies.builder()
  3.         .codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(size))
  4.         .build();
  5. WebClient webClient = WebClient.builder()
  6.         .exchangeStrategies(strategies)
  7.         .build();
  8. Mono<byte[]> response = webClient.get()
  9.         .uri("http://127.0.0.1:9999/file/download/1.png")
  10.         .accept(MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG)
  11.         .retrieve()
  12.         .bodyToMono(byte[].class);
  13. response.subscribe(result -> {
  14.     System.out.println("请求成功");
  15.     if (result != null) System.out.println("result length is " + result.length);
  16. }, throwable -> {
  17.     throwable.printStackTrace();
  18. });
复制代码

三、泛型相应

1、问题案例

(1)Entity


  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class Person<T> {
  5.     private String name;
  6.     private int age;
  7.     private T thing;
  8. }
复制代码

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class Computer {
  5.     private String name;
  6.     private Double price;
  7. }
复制代码
(2)Server

  1. @GetMapping("/testGeneric")
  2. public Person<Computer> testGeneric() {
  3.     Computer computer = new Computer("联想电脑", 8999.0);
  4.     Person<Computer> person = new Person<Computer>("张三", 20, computer);
  5.     return person;
  6. }
复制代码
(3)Client

  1. WebClient webClient = WebClient.create();
  2. Mono<Person> response = webClient.get()
  3.         .uri("http://127.0.0.1:9999/test/testGeneric")
  4.         .retrieve()
  5.         .bodyToMono(Person.class);
  6. response.subscribe(person -> {
  7.     System.out.println("请求成功");
  8.     System.out.println(person);
  9.     Computer computer = (Computer) person.getThing();
  10.     System.out.println(computer);
  11. }, throwable -> {
  12.     System.out.println("请求失败,结果为:" + throwable.getMessage());
  13. });
复制代码

  1. 请求成功
  2. Person(name=张三, age=20, thing={name=联想电脑, price=8999.0})
  3. 请求失败,结果为:class java.util.LinkedHashMap cannot be cast to class com.zy.api.Computer (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.zy.api.Computer is in unnamed module of loader 'app')
复制代码
2、处理计谋


  1. WebClient webClient = WebClient.create();
  2. Mono<Person<Computer>> response = webClient.get()
  3.         .uri("http://127.0.0.1:9999/test/testGeneric")
  4.         .retrieve()
  5.         .bodyToMono(new ParameterizedTypeReference<Person<Computer>>() {
  6.         });
  7. response.subscribe(person -> {
  8.     System.out.println("请求成功");
  9.     System.out.println(person);
  10.     Computer computer = person.getThing();
  11.     System.out.println(computer);
  12. }, throwable -> {
  13.     System.out.println("请求失败,结果为:" + throwable.getMessage());
  14. });
复制代码

四、跟随重定向相应

1、问题案例

(1)Server

  1. server:
  2.   port: 9999
  3. spring:
  4.   mvc:
  5.     static-path-pattern: /file/download/**
  6.   web:
  7.     resources:
  8.       static-locations: file:D:/fileUpload/
复制代码
  1. @GetMapping("/testRedirect2Image")
  2. public ResponseEntity testRedirect2Image() {
  3.     return ResponseEntity.status(HttpStatus.SEE_OTHER)
  4.             .header("Location", "http://127.0.0.1:9999/file/download/1.png")
  5.             .build();
  6. }
复制代码
(2)Client

  1. WebClient webClient = WebClient.create();
  2. webClient.get()
  3.         .uri("http://127.0.0.1:9999/test/testRedirect2Image")
  4.         .accept(MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG) // 指定了客户端期望接受的响应内容类型
  5.         .retrieve() // 获取响应
  6.         .bodyToFlux(DataBuffer.class) // 将响应体转换为 Flux<DataBuffer>
  7.         .reduce(new org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream(), (baos, dataBuffer) -> {
  8.             try {
  9.                 byte[] bytes = new byte[dataBuffer.readableByteCount()];
  10.                 dataBuffer.read(bytes);
  11.                 baos.write(bytes);
  12.                 DataBufferUtils.release(dataBuffer);
  13.             } catch (IOException e) {
  14.                 e.printStackTrace();
  15.                 DataBufferUtils.release(dataBuffer);
  16.                 return null;
  17.             }
  18.             return baos;
  19.         })
  20.         .map(byteArrayOutputStream -> {
  21.             if (byteArrayOutputStream == null) return null;
  22.             return byteArrayOutputStream.toByteArray();
  23.         })
  24.         .subscribe(result -> {
  25.             if (result == null) {
  26.                 System.out.println("result is null");
  27.                 return;
  28.             }
  29.             System.out.println("result length: " + result.length);
  30.         }, throwable -> {
  31.             throwable.printStackTrace();
  32.         });
复制代码

  1. result length: 0
复制代码
2、处理计谋


  1. HttpClient httpClient = HttpClient.create()
  2.         .followRedirect(true); // 允许跟随重定向
  3. WebClient webClient = WebClient.builder()
  4.         .clientConnector(new ReactorClientHttpConnector(httpClient))
  5.         .build();
  6. webClient.get()
  7.         .uri("http://127.0.0.1:9999/test/testRedirect2Image")
  8.         .accept(MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG) // 指定了客户端期望接受的响应内容类型
  9.         .retrieve() // 获取响应
  10.         .bodyToFlux(DataBuffer.class) // 将响应体转换为 Flux<DataBuffer>
  11.         .reduce(new org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream(), (baos, dataBuffer) -> {
  12.             try {
  13.                 byte[] bytes = new byte[dataBuffer.readableByteCount()];
  14.                 dataBuffer.read(bytes);
  15.                 baos.write(bytes);
  16.                 DataBufferUtils.release(dataBuffer);
  17.             } catch (IOException e) {
  18.                 e.printStackTrace();
  19.                 DataBufferUtils.release(dataBuffer);
  20.                 return null;
  21.             }
  22.             return baos;
  23.         })
  24.         .map(byteArrayOutputStream -> {
  25.             if (byteArrayOutputStream == null) return null;
  26.             return byteArrayOutputStream.toByteArray();
  27.         })
  28.         .subscribe(result -> {
  29.             if (result == null) {
  30.                 System.out.println("result is null");
  31.                 return;
  32.             }
  33.             System.out.println("result length: " + result.length);
  34.         }, throwable -> {
  35.             throwable.printStackTrace();
  36.         });
复制代码

五、SSL 证书

1、问题案例

  1. WebClient webClient = WebClient.create();
  2. Mono<byte[]> response = webClient.get()
  3.         .uri(url)
  4.         .accept(MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG)
  5.         .retrieve()
  6.         .bodyToFlux(DataBuffer.class)
  7.         .reduce(new ByteArrayOutputStream(), (baos, dataBuffer) -> {
  8.             try {
  9.                 byte[] bytes = new byte[dataBuffer.readableByteCount()];
  10.                 dataBuffer.read(bytes);
  11.                 baos.write(bytes);
  12.                 DataBufferUtils.release(dataBuffer);
  13.             } catch (IOException e) {
  14.                 e.printStackTrace();
  15.                 DataBufferUtils.release(dataBuffer);
  16.                 return null;
  17.             }
  18.             return baos;
  19.         })
  20.         .map(byteArrayOutputStream -> {
  21.             if (byteArrayOutputStream == null) return null;
  22.             return byteArrayOutputStream.toByteArray();
  23.         });
  24. response.subscribe(result -> {
  25.     System.out.println("请求成功");
  26.     if (result != null) System.out.println("result length is " + result.length);
  27. }, throwable -> {
  28.     throwable.printStackTrace();
  29. });
复制代码

  1. org.springframework.web.reactive.function.client.WebClientRequestException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
复制代码
2、忽略 SSL 证书

  1. SslContext context = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
  2. HttpClient httpClient = HttpClient.create().secure(t -> t.sslContext(context));
  3. WebClient webClient = WebClient.builder()
  4.         .clientConnector(new ReactorClientHttpConnector(httpClient))
  5.         .build();
  6. Mono<byte[]> response = webClient.get()
  7.         .uri(url)
  8.         .accept(MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG)
  9.         .retrieve()
  10.         .bodyToFlux(DataBuffer.class)
  11.         .reduce(new ByteArrayOutputStream(), (baos, dataBuffer) -> {
  12.             try {
  13.                 byte[] bytes = new byte[dataBuffer.readableByteCount()];
  14.                 dataBuffer.read(bytes);
  15.                 baos.write(bytes);
  16.                 DataBufferUtils.release(dataBuffer);
  17.             } catch (IOException e) {
  18.                 e.printStackTrace();
  19.                 DataBufferUtils.release(dataBuffer);
  20.                 return null;
  21.             }
  22.             return baos;
  23.         })
  24.         .map(byteArrayOutputStream -> {
  25.             if (byteArrayOutputStream == null) return null;
  26.             return byteArrayOutputStream.toByteArray();
  27.         });
  28. response.subscribe(result -> {
  29.     System.out.println("请求成功");
  30.     if (result != null) System.out.println("result length is " + result.length);
  31. }, throwable -> {
  32.     throwable.printStackTrace();
  33. });
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4