9

我一直在努力使用几个类实现来检索分块数据,但没有成功。以下是有问题的简化代码模块。在网上冲浪后,过去似乎出现过问题(2009、2010;1.1、1.5 版),但现在应该已经解决了。我还没有看到这个协议在 Android 平台上取得了任何明确的成功。

帮助!

如果我输入了无效的令牌,我能够看到一些响应——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();
                }
4

1 回答 1

9

我已经用 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();
    }
}
于 2011-02-28T18:34:32.393 回答