9

チャンク化されたデータを取得するために、いくつかのクラスの実装に苦労しましたが、成功しませんでした。以下は、問題のある単純化されたコード モジュールです。Web をサーフィンした後、過去に問題があったようです (2009 年、2010 年; バージョン 1.1、1.5)、今では解決されているはずです。このプロトコルの Android プラットフォームでの決定的な成功は見たことがありません。

ヘルプ!

無効なトークンを入力すると、何らかの応答が表示されます。Web サービスは、アプリケーション エラー メッセージで応答します。ただし、有効な URL とトークンはチャンクされたプロトコルの検出で応答するだけで (isChunked() は true を返します)、何も読み取られず、何もタイムアウトしません。

コマンド ラインから CURL を使用して発行されたまったく同じ URL は、期待どおりに機能し、連続したコンテンツ (Web サービスから公開されたデータ) を表示します。

受信ストリームを強制するために行末を追加するなど、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 のエミュレータでテストしましたが、問題なく動作します。私が使用していたチャンク URL は次のとおりです。

        uri = new URI("http://www.httpwatch.com/httpgallery/chunked/");

BasicResponseHandlerがストリームの最後に到達するまで読み取りを試行し続け、その後、データ全体を一度に返すことに気付きました。ストリームが閉じるのを待って、コードがハングアップする可能性がありました。Web サービスはストリームを終了しますか? それとも、チャンクを永遠に返し続けますか? 最初のチャンクだけを取得する方法はわかりませんが、入力ストリームから最初の読み取りを読み取るだけの単純なハンドラーを作成しました (十分な大きさのバッファーがチャンクに対応する場合)。テストに使用した 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 に答える