java - RestTemplate Exchange 超时但 PostMan 可以工作

标签 java rest spring-boot postman spring-rest

我尝试使用 Spring 的 RestTemplate 发出简单的 GET 请求。

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers headers = new HttpHeaders() {
            {
                String auth = username + ":" + password;
                byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.US_ASCII));
                String authHeader = "Basic " + new String(encodedAuth);
                set(HttpHeaders.AUTHORIZATION, authHeader);
                //set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString());
            }
        };

ResponseEntity<FileTypeList> response = restTemplate.exchange(endpoint + FILES, HttpMethod.GET, new HttpEntity(headers), FileTypeList.class);
return response.getBody() != null ? response.getBody().getFileTypes() : Collections.emptyList();

此调用出现超时错误:

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_161]
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_161]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_161]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_161]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_161]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_161]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_161]
    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_161]
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673) ~[na:1.8.0_161]

但是当我尝试与 Postman 进行相同的调用时,它可以正常工作。

端点是https://verda.borsaistanbul.com/files

Spring RestTemplate 与 Postman 有何不同?

最佳答案

Rest 模板允许您设置代理。有多种方法可以做到这一点,最简单的方法如下:

在创建RestTemplate之前,使用以下代码设置代理:

Properties props = System.getProperties();
props.put("http.proxyHost", "your.proxy.server");
props.put("http.proxyPort", "80");

请注意,这将为 JVM 中的 while Java 应用程序设置代理。

设置代理的另一种方法如下,它将仅为您当前的代码设置代理:

SimpleClientHttpRequestFactory clientHttpReq = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("your.proxy.server", 80));
clientHttpReq.setProxy(proxy);
RestTemplate restTemplate = new RestTemplate(clientHttpReq);

关于java - RestTemplate Exchange 超时但 PostMan 可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57869876/

相关文章:

java - 如何与 Java 中的 RESTful 服务中的阻塞队列交互?

java - 使用另一个库将驱动程序路径发送到 selenium 节点

api - 甚至为网站本身使用网站的 API?

java - 如何在Spring Boot中从实体类调用基于服务的类

java - 如何知道某个网站是否基于Servlet/JSP?

java - 用于执行 Java Web 服务的测试工具工具

java - 如何使用Monit Web Service API java

REST API 包括和排除子资源

java - SpringBoot 2.2.1 groovyMarkupConfigurer 异常

java - Spring Data Couchbase 对象 id