Java REST客户端:java.net.ConnectException:连接超时:连接

4

您好,我有一个部署在Weblogic服务中的Spring Rest Webservice。 我有Google Chrome的高级rest客户端,可以在https上完美运行。 我正在尝试在https客户端上创建客户端。 我有CA证书和客户端证书。 我从下面的链接创建了它 使用Jersey客户端访问安全的RESTful Web服务 但是我得到了以下异常

Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection timed out: connect
        at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:155)
        at com.sun.jersey.api.client.Client.handle(Client.java:652)
        at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
        at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
        at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570)
        at org.app.last.JerseyClient.get_JSON(JerseyClient.java:39)
        at org.app.last.JerseyClient.main(JerseyClient.java:239)
    Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:564)
        at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:141)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
        at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:272)
        at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
        at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:253)
        at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:153)
        ... 6 more

似乎你正在使用的端点无效或者没有响应。 - user2793390
我可以在 Chrome REST 客户端中完美地使用这些端点。 - ramesh027
很可能您确实遇到了超时问题。这可能是由于网络问题(网络缓慢、服务器无响应等)引起的。我建议您从同一客户端计算机尝试此调用,而不是从代码中尝试(例如,如果是GET,则使用浏览器进行尝试;如果是POSTPUT,则使用curl等工具)。 - Avi
2
我正在向服务器发送一个application/json的空白POST请求。方法是public <T> T get_JSON(Class<T> responseType,String input) throws UniformInterfaceException { return webResource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(responseType,input); }。而且这个端点在Chrome浏览器的高级REST客户端中完美地工作。 - ramesh027
@ramesh027 也许你在Java中的实现最终得到的URL是无效的。API可能会在你指定的任何URL之后附加一些内容。 - user2793390
@user2793390 我正在将输入变量(StringEntity)添加到请求中。它在使用http调用时运行良好,但在使用https调用时失败。 - ramesh027
4个回答

2

看起来你仍然在代理方面遇到问题,也可能会有证书问题

  1. 检查你是否正确配置了代理
  2. 检查你的证书是否过期。如果过期,请申请一个新证书
  3. 使用 Fiddler 工具检查是否向服务器发送了证书

1

请检查防火墙设置,查看除浏览器外的出站端口是否被阻止。这在某些公司中偶尔会发生。

默认情况下,出站端口是开放的,但系统管理员可能会更改此设置 - 请参见此 answer

此外,连接可能被阻止在公司代理服务器层面上。例如,在一些公司中,你只能使用一个浏览器进行浏览,如果你安装并尝试使用另一个浏览器访问互联网,你会收到一条消息“只允许使用浏览器XX浏览互联网”或超时提示。

这种方式有效是因为代理服务器检查用户代理标头。

许多代理服务器需要验证,并且只授权给经过授权的用户访问。 Chrome在浏览时自动填写您的凭据,但您的程序不会这样做。

要解决此问题,请尝试以下可能性:

  • 使用System.out.println将URL打印到控制台,并确认它与您在Chrome中输入的完全相同

  • 使用非基于浏览器的命令行实用程序,如curl或wget,检查是否可以访问例如Google和端点

  • 检查您的防火墙设置


1
我尝试使用代理连接,但仍然出现以下错误:Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection timed out: connect at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:155) at com.sun.jersey.api.client.Client.handle(Client.java:652) at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) - ramesh027
1
我曾经尝试过在忽略SSL的情况下工作,它能够正常运行,但是在使用SSL时就出现了问题。 - ramesh027
我在另一个问题中发布了这个问题 https://dev59.com/LH3aa4cB1Zd3GeqPgq8v - ramesh027

0
请在Eureka服务器应用程序的application.properties文件中添加以下属性:
eureka.server.peer-node-read-timeout-ms=6000

如果不起作用,尝试增加读取超时时间。
在我的情况下,这是有效的。

0

这不是证书问题,否则您会看到SSL错误。请检查您的代理设置。在Spring应用程序中,您可以将以下内容添加到VM参数中以设置代理:-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接