pha*_*udi 10 rest android inputstream httpurlconnection
我有网络服务URL,它工作正常.它提供了JSON数据.当我使用HttpURLConnection时InputStream,我收到一个错误.喜欢
java.io.IOException:Connection上的意外流结束{comenius-api.sabacloud.com:443,proxy = DIRECT hostAddress = 12.130.57.1 cipherSuite = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 protocol = http/1.1}(recycle count = 0)
try{
URL url = new URL("https://comenius-api.sabacloud.com/v1/people/username="+username+":(internalWorkHistory)?type=internal&SabaCertificate="+ certificate);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
InputStream ist = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ist));
while((singleLine = reader.readLine())!= null){
data = data + singleLine;
Log.e("Response", data);
}
}catch(Exception e)
{
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
怎么解决这个问题?
Rad*_*ost 17
我有同样的问题使用OKHttp3.问题是我没有关闭每个请求的连接,并且客户端可以使用相同的连接而服务器没有,因此服务器返回错误.
解决方案是指示每个请求在完成时关闭连接.您必须在标头中添加一个标志来指示这一点.在OKHttp3是这样的:
Request request = new Request.Builder()
.url(URL)
.header("Connection", "close")
...
Run Code Online (Sandbox Code Playgroud)
“Keepalive 使客户端很难确定一个响应在哪里结束,下一个响应从哪里开始” 1
似乎该问题是由在 2 种情况下重用活动连接时发生冲突引起的:
服务器不在响应头中发送Content-Length
(流式内容情况,因此不能使用 Content-Length)服务器不使用分块传输编码
因此,如果您观察到异常,请嗅探 http 标头(例如在 Android Studio Profiler 工具中)。如果您将在响应标头中看到两者
和不
那么这就是上面描述的情况。
由于这完全是服务器问题,因此解决方案应该是计算Content-Length并将其放入服务器端的响应头中,如果可能的话(或使用分块传输编码)。
在客户端关闭连接的建议应该被视为一种解决方法,请记住它会降低整体性能。
| 归档时间: |
|
| 查看次数: |
27897 次 |
| 最近记录: |