有 Android 开发人员成功从 Web 服务接收分块传输协议吗?

2024-02-12

我一直在努力尝试几个类实现来检索分块数据,但没有成功。以下是存在问题的简化代码模块。在网上冲浪后,似乎过去曾出现过问题(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(使用前将#替换为@)

有 Android 开发人员成功从 Web 服务接收分块传输协议吗? 的相关文章

随机推荐