我一直在努力尝试几个类实现来检索分块数据,但没有成功。以下是存在问题的简化代码模块。在网上冲浪后,似乎过去曾出现过问题(2009、2010;版本1.1、1.5),但现在应该已经解决了。我还没有看到该协议在 Android 平台上取得任何明确的成功。
Help!
如果我输入无效令牌,我可以看到一些响应 - Web 服务将使用应用程序错误消息进行响应。然而,有效的 url 和令牌将简单地通过检测分块协议(isChunked() 返回 true)来响应,但不会读取任何内容,也不会超时等。
从命令行使用 CURL 发出的完全相同的 URL 按预期工作并显示连续内容(从 Web 服务发布的数据)。
是否有任何网络服务端黑客行为,例如添加更多行尾,以强制接收流?
URI uri;
try {
uri = new URI("http://cws.mycompany.com/service/events?accesskeyid=8226f3ddc65a420abc391d8f1fe12de44766146762_1298174060748");
HttpClient httpClient=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(uri);
ResponseHandler<String> rh=new BasicResponseHandler();
String responseString=httpClient.execute(httpGet,rh);
Log.d(TAG, "response as string:\n" + responseString);
} catch (URISyntaxException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
} catch (ClientProtocolException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
我已经使用 Android 2.2 在我的模拟器上测试了您编写的代码,并且运行良好。我使用的分块网址是:
uri = new URI("http://www.httpwatch.com/httpgallery/chunked/");
我注意到BasicResponseHandler
继续尝试读取,直到到达流的末尾,然后立即返回整个数据。代码可能会挂起等待流关闭。您的网络服务会结束流吗?或者它会永远继续回馈块吗?我没有看到只返回第一个分块的方法,但我确实编写了一个简单的处理程序,它只从输入流中读取第一个读取内容(给定一个足够大的缓冲区对应于该块)。对于我用于测试的 URI,它将 HTML 文件的每一行作为一个块返回。您可以在此处看到返回的第一个。
如果这对您有用,那么您可以轻松编写一个处理程序,该处理程序返回而不是字符串,返回枚举或其他可以返回每个块的对象。甚至是你自己的班级。
public class ChunkedResponseHandler implements ResponseHandler<String> {
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
int n = in.read(b);
out.append(new String(b, 0, n));
return out.toString();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)