使用浏览器访问一个url能正常访问,但是通过java httpclient请求时却总是超时,是怎么回事啊?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用浏览器访问一个url能正常访问,但是通过java httpclient请求时却总是超时,是怎么回事啊?相关的知识,希望对你有一定的参考价值。
public Map<String, Object> judge(Model model, String deviceIpPort)
Map<String, Object> map = Maps.newHashMap();
// 创建HttpClientBuilder
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
// HttpClient
CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(timeOut).setConnectTimeout(timeOut).build();// 设置请求和传输超时时间
String url = "http://" + deviceIpPort;
// 获取页面点击时候的URL
HttpPost httppost = new HttpPost(url);
httppost.setConfig(requestConfig);
try
// 执行get请求
HttpResponse httpResponse = closeableHttpClient.execute(httppost);
// 获取响应消息实体
HttpEntity entity = httpResponse.getEntity();
// 响应状态
System.out.println("status:" + httpResponse.getStatusLine().getStatusCode()); // 得到http响应结果的状态代码
// 判断响应实体是否为空
if (httpResponse.getStatusLine()
.getStatusCode() == HttpStatus.SC_OK )
map.put("result", true);
map.put("msg", deviceIpPort+"登录成功");
System.out.println("contentEncoding:"
+ entity.getContentEncoding());
System.out.println("response content:"
+ EntityUtils.toString(entity));
catch (Exception e)
map.put("result", false);
map.put("msg", "登录失败,当前设备不在线或者网络不通");
log.error("VideoTimeOutRestController.judge",e);
finally
try
// 关闭流并释放资源
closeableHttpClient.close();
catch (IOException e)
e.printStackTrace();
return map;
就是有的IP地址在公司的局域网下可以访问 但是有的不可以访问 响应超时 URL在页面都是可以直接登录的 也没有设置代理 求大神解决办法啊
嗯,我已经检查了网络原因:url直接访问都是可以的,然后可以ping通,Telnet端口也是通的,但是就是有部分url在httpclient执行post请求的时候,是访问超时的。麻烦大神,请问这样是什么情况呢?
来自:求助得到的回答 参考技术A 找到问题了吗? 参考技术B 找到问题了么为啥我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作?
【中文标题】为啥我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作?【英文标题】:Why would my C# app fail on this REST request but but works fine through a browser?为什么我的 C# 应用程序在此 REST 请求上失败,但通过浏览器可以正常工作? 【发布时间】:2015-12-31 04:38:23 【问题描述】:我有一个 C# 应用程序,我正在通过 REST 访问一些数据,因此我传入一个 URL 以获取 JSON 有效负载。我以编程方式访问了几个不同的 URL,使用下面的代码,它们都可以正常工作除了一次调用。
这是我的代码:
var url = "http://theRESTURL.com/rest/API/myRequest";
var results = GetHTTPClient().GetStringAsync(url).Result;
var restResponse = new RestSharp.RestResponse();
restResponse.Content = results;
var _deserializer = new JsonDeserializer();
GetHTTPClient() 在哪里使用下面的代码:
private HttpClient GetHTTPClient()
var httpClient = new HttpClient(new HttpClientHandler()
Credentials = new System.Net.NetworkCredential("usr", "pwd"),
UseDefaultCredentials = false,
UseProxy = true,
Proxy = new WebProxy(new Uri("http://myproxy.com:8080")),
AllowAutoRedirect = false
);
httpClient.Timeout = new TimeSpan(0,0, 3500);
return httpClient;
正如我所说,上面的代码工作正常,但有一堆不同的请求,但对于一个特定的请求,我在
.GetStringAsync(url).Result
调用错误:
无法从传输连接读取数据:现有连接被远程主机强行关闭
等待大约 10 分钟后,我收到了该错误。有趣的是,如果我直接将无法使用的相同 URL 放入 Internet Explorer,我确实会返回 JSON 有效负载(大约 10 分钟后)。所以我很困惑为什么
直接在浏览器中可以正常工作,但在使用上面的代码时会失败。 这一个请求失败,但使用相同代码的其他请求以编程方式工作正常。对于尝试的事情有什么建议,或者我应该要求服务器所有者检查他们的结果以帮助诊断发生了什么?
【问题讨论】:
检查浏览器发出的请求。 很可能是标题/协商或超时问题。我通常使用fiddler来做这种检查。 尽量避免使用Task.Result
,它可能会导致死锁,这可能是这里的罪魁祸首,而不是await
任务来得到它的结果。
@LasseV.Karlsen - 你能给我一个你在说什么的例子吗?
你可以这样写那行代码:var results = await GetHTTPClient().GetStringAsync(url);
这意味着这行代码的方法也必须是异步的,但是更多信息请看这里:Don't Block on Async Code。
【参考方案1】:
我认为这里超时不是问题,因为错误表明连接已远程关闭,并且设置的超时时间约为 58 分钟,与您的其他数字相比,这已经绰绰有余了。
您是否尝试过查看请求本身?可能想用这些结果编辑您的问题。
【讨论】:
我同意我的超时长度比我收到此错误的时间长得多。您能否澄清您的问题“查看请求本身?”。你有什么建议? 使用 fiddler 可以准确地看到你的请求头是什么样子,只需比较浏览器和应用请求的头。此外,按照建议,检查所涉及的代理。 事实证明,我的 REST 调用与浏览器使用了不同的代理。一旦我纠正它按预期工作【参考方案2】:如果您删除行 httpClient.Timeout = new TimeSpan(0,0, 3500);
,问题应该会得到解决,但如果请求会持续 20 分钟,您应该一直等待。
【讨论】:
我不明白这一点,因为我的超时时间远大于 20 分钟? 对不起!我读过 350。350 秒是 5 分钟,因为它写在你的问题中。我的错。 20分钟就是一个例子。但是,您是否尝试删除该行?以上是关于使用浏览器访问一个url能正常访问,但是通过java httpclient请求时却总是超时,是怎么回事啊?的主要内容,如果未能解决你的问题,请参考以下文章