Java+Springboot中向远程地址发送http请求和return响应的方式数

Number of ways to send http request to remote address and return response in Java+Springboot

我对向远程地址发送请求的可能方式有一些疑问,然后 return 在 Springboot 中使用 Java 语言进行响应。到目前为止,我尝试只使用 CloseableHttpClient 和 CloseableHttpResponse 来做到这一点,对地址进行 rest post 调用,然后 return 响应(但到目前为止我一直无法正确读取响应,因为方法 EntityUtils.getString() 一直在抛出异常.. Extracting JSON from response as ResponseEntityProxy{[Content-Type: application/json;charset=UTF-8,Chunked: true]} )
有没有人有其他想法如何实现,是否有其他可能的方法可以发送 HTTP 请求(使用 headers 和 body)并读取这些技术中的响应?(或至少在其他一些技术中,如果在这些技术中是不可能的..)。
如果有任何帮助或建议,我将不胜感激。

据我所知,有两种常见的方法可以在 Spring Boot.

中发出 API 请求
  1. RestTemplate
  2. WebClient

大多数人都经常使用 RestTemplate。但它将在未来几年被弃用。所以我建议你使用 WebClient.

下面WebClientPOSTREQUEST例子:

 @Autowired
 private WebClient.Builder webClientBuilder;


 Turnover turnover = new Turnover();
                
 Gson resp = webClientBuilder.build()
 .post()
 .uri("url")
 .contentType(MediaType.APPLICATION_JSON)
 .accept(MediaType.APPLICATION_JSON )
 .body(Mono.just(turnover),Turnover.class)
 .retrieve()
 .bodyToMono(Gson.class).block();

Turnover.java

@Getter
@Setter
public class Turnover {

    private String start_date;
    private String end_date;
    private String account;

    public Turnover(){
        setStart_date("01.01.2020");
        setEnd_date("01.06.2020");
        setAccount("20293435454");
    }
}

webClientBuilder Bean。就我而言,我有 PROXY。所以我使用了代理 url 和端口。

@Bean
    public WebClient.Builder getWebClientBuilder(){

        HttpClient httpClient = HttpClient.create()
                .tcpConfiguration(tcpClient ->
                        tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).host("url").port(portnumber)));
        ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
        return WebClient.builder().clientConnector(connector);
    }

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

并且不要忘记在 Main java class 中创建 Bean WebClient。上面我只是举了一个例子。您需要根据您的要求更改参数。