WebClientUtil.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package com.njuzr.eaibackend.utils;
  2. import io.netty.handler.ssl.SslContextBuilder;
  3. import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.http.HttpHeaders;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.http.client.reactive.ReactorClientHttpConnector;
  8. import org.springframework.web.reactive.function.client.WebClient;
  9. import org.springframework.web.reactive.function.client.WebClientResponseException;
  10. import reactor.netty.http.client.HttpClient;
  11. import reactor.netty.transport.ProxyProvider;
  12. import java.nio.file.Path;
  13. import java.util.HashMap;
  14. import java.util.function.Consumer;
  15. /**
  16. * @author: Leonezhurui
  17. * @Date: 2024/2/25 - 16:52
  18. * @Package: EAI-Backend
  19. */
  20. @Slf4j
  21. public class WebClientUtil {
  22. private final WebClient webClient;
  23. public WebClientUtil() {
  24. this.webClient = WebClient.builder().build();
  25. }
  26. // 构造函数,使用baseUrl初始化WebClient
  27. public WebClientUtil(String baseUrl) {
  28. // SslContextBuilder sslContextBuilder = SslContextBuilder
  29. // .forClient()
  30. // .trustManager(InsecureTrustManagerFactory.INSTANCE); // 信任所有证书
  31. //
  32. // HttpClient httpClient = HttpClient.create()
  33. // .secure(sslContextSpec -> sslContextSpec.sslContext(sslContextBuilder));
  34. // this.webClient = WebClient.builder()
  35. // .clientConnector(new ReactorClientHttpConnector(httpClient))
  36. // .baseUrl(baseUrl)
  37. // .build();
  38. HttpClient httpClient = HttpClient.create()
  39. .proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
  40. .host("127.0.0.1")
  41. .port(7890));
  42. this.webClient = WebClient.builder()
  43. .clientConnector(new ReactorClientHttpConnector(httpClient))
  44. .baseUrl(baseUrl)
  45. .build();
  46. }
  47. // GET请求方法
  48. public <T> T get(String uri, Class<T> responseType) {
  49. try {
  50. return this.webClient.get()
  51. .uri(uri)
  52. .retrieve()
  53. .bodyToMono(responseType)
  54. .block(); // 转换为阻塞调用
  55. } catch (WebClientResponseException e) {
  56. log.error("WebClient发送GET请求失败:" + e.getMessage());
  57. throw new RuntimeException("Failed to get response: " + e.getMessage(), e);
  58. }
  59. }
  60. // POST请求方法
  61. public <T, R> T post(String uri, R request, Class<T> responseType) {
  62. try {
  63. return this.webClient.post()
  64. .uri(uri)
  65. .bodyValue(request)
  66. .retrieve()
  67. .bodyToMono(responseType)
  68. .block(); // 转换为阻塞调用
  69. } catch (WebClientResponseException e) {
  70. log.error("WebClient发送POST请求失败:" + e.getMessage());
  71. throw new RuntimeException("Failed to post data: " + e.getMessage(), e);
  72. }
  73. }
  74. // PUT请求方法
  75. public <T, R> T put(String uri, R request, Class<T> responseType) {
  76. try {
  77. return this.webClient.put()
  78. .uri(uri)
  79. .bodyValue(request)
  80. .retrieve()
  81. .bodyToMono(responseType)
  82. .block(); // 转换为阻塞调用
  83. } catch (WebClientResponseException e) {
  84. log.error("WebClient发送PUT请求失败:" + e.getMessage());
  85. throw new RuntimeException("Failed to put data: " + e.getMessage(), e);
  86. }
  87. }
  88. // DELETE请求方法
  89. public <T> T delete(String uri, Class<T> responseType) {
  90. try {
  91. return this.webClient.delete()
  92. .uri(uri)
  93. .retrieve()
  94. .bodyToMono(responseType)
  95. .block(); // 转换为阻塞调用
  96. } catch (WebClientResponseException e) {
  97. log.error("WebClient发送DELETE请求失败:" + e.getMessage());
  98. throw new RuntimeException("Failed to delete resource: " + e.getMessage(), e);
  99. }
  100. }
  101. public <T, R> T postWithToken(String uri, R request, Class<T> responseType, String key) {
  102. try {
  103. return this.webClient.post()
  104. .uri(uri)
  105. .header("Authorization", "Bearer " + key)
  106. .bodyValue(request)
  107. .retrieve()
  108. .bodyToMono(responseType)
  109. .block(); // 转换为阻塞调用
  110. } catch (WebClientResponseException e) {
  111. log.error("WebClient发送POST请求失败:" + e.getMessage());
  112. throw new RuntimeException("Failed to post data: " + e.getMessage(), e);
  113. }
  114. }
  115. }