使用OkHttp过程出现java.net.SocketException: Connection reset 异常。我个人觉得okhttp时好时坏,使用它的api有时候能够登录GitHub成功,有时候一直登录失败,报此Connection reset 异常。具体原因我也不清楚,这个网络上有相关文章。但是GitHub应该做了相关的处理,如果你在一段时间内频繁访问它的api网站,它会给你拒绝连接,就好比抵制恶意攻击,我换用这个HttpClient后,至少比原来的okhttp方式好一些,十次能有8次成功。所以最好的方式就是换掉它。
换什么呢? 当然是更稳定的技术,我查询了一下,发现的它的同类技术,叫HttpClient就相对稳定。 解决方法如下1.在pom文件中引入HttpClient需要的依赖
org.apache.httpcomponents
httpcore
4.4.10
org.apache.httpcomponents
httpclient
4.5.6
- 代码改写如下:
因为我这里出问题的只有这个函数,所以就改写了这一块的代码,测试后再也没出现reset异常。这里还顺便解决了token不能作为参数查询的问题,GitHub好像2020年马上就不会支持这种方式了,所以应该把这个token放到header中去。
public GithubUser getUser(String accessToken) throws Exception {
int timeout = 60;
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000)
.setConnectionRequestTimeout(timeout * 1000)
.build();
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("https://api.github.com/user");
httpget.addHeader(new BasicHeader("Authorization", "token "+accessToken));
httpget.setProtocolVersion(HttpVersion.HTTP_1_0);
httpget.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
httpget.setConfig(defaultRequestConfig);
CloseableHttpResponse response = null;
try {
response = httpclient.execute(httpget);
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
GithubUser user = JSON.parseObject(entity.getContent(),GithubUser.class);
EntityUtils.consume(entity);
response.close();
return user;
} catch (Exception e){
throw e;
} finally{
if(response != null){
response.close();
}
if(httpclient!=null){
httpclient.close();
}
}
}
一些个人想法和建议
到获取用户信息这一环节,前面的环节都没问题,但是到获取用户信息这一步就经常出现reset异常。这个也是一种变相保护。也有可能是需要返回的用户数据有点多。尽量还是少登录退出着玩。这个bug困扰了很久,也解决不了。实在不行,还有办法,最下策,换多个GitHub账号,你多用几个邮箱注册,那账号就多了,可以这个号被reset就换下一个登录。它GitHub总不能把所有号都reset。每个号怎么也得给个5到6次机会。事实上也是这样,我就弄了两个邮箱注册的GitHub。至少调试这个项目是够了。



