1

HTTPS を使用して Android で Web ページをフェッチしています (ここに表示されているように、証明書は自己署名されており、古いため、無視します- 聞かないでください、それは私のサーバーではありません :))。

私は自分の

public class MyHttpClient extends DefaultHttpClient {


    public MyHttpClient() {
        super();
        final HttpParams params = getParams();
        HttpConnectionParams.setConnectionTimeout(params,
                REGISTRATION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(params, REGISTRATION_TIMEOUT);
        ConnManagerParams.setTimeout(params, REGISTRATION_TIMEOUT);
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
                .getSocketFactory(), 80));
        registry.register(new Scheme("https", new UnsecureSSLSocketFactory(), 443));
        return new SingleClientConnManager(getParams(), registry);
    }
}

言及されている UnsecureSSLSocketFactory は、前述のトピックに関する提案に基づいています。

次に、このクラスを使用してページを作成しています

public class HTTPHelper {

    private final static String TAG = "HTTPHelper";
    private final static String CHARSET = "ISO-8859-1";

    public static final String USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)";
    public static final String ACCEPT_CHARSET = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    public static final String ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";


    /**
     * Sends an HTTP request
     * @param url
     * @param post
     * @return
     */
    public String sendRequest(String url, String post) throws ConnectionException {

        MyHttpClient httpclient = new MyHttpClient();

        HttpGet httpget = new HttpGet(url);
        httpget.addHeader("User-Agent", USER_AGENT);
        httpget.addHeader("Accept", ACCEPT);
        httpget.addHeader("Accept-Charset", ACCEPT_CHARSET);

        HttpResponse response;
        try {
            response = httpclient.execute(httpget);
        } catch (Exception e) {
            throw new ConnectionException(e.getMessage());
        }

        HttpEntity entity = response.getEntity();

        try {
            pageSource = convertStreamToString(entity.getContent());
        } catch (Exception e) {
            throw new ConnectionException(e.getMessage());
        }
        finally {
            if (entity != null) {
                try {
                    entity.consumeContent();
                } catch (IOException e) {
                    throw new ConnectionException(e.getMessage());
                }
            }
        }

        httpclient.getConnectionManager().shutdown();
        return pageSource;

    }

    /**
     * Converts a stream to a string
     * @param is
     * @return
     */
    private static String convertStreamToString(InputStream is) 
    {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, CHARSET));
            StringBuilder stringBuilder = new StringBuilder();
            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line + "\n");
                }
            } catch (IOException e) {
                Log.d(TAG, "Exception in convertStreamToString", e);
            } finally {
                try {
                    is.close();
                } catch (IOException e) {}
            }
            return stringBuilder.toString();
        } catch (Exception e) {
            throw new Error("Unsupported charset");
        }
    }

}

取得したページは、約 100 行で切り捨てられます。「_」(アンダースコア)文字の後に「r」文字が続く正確なポイントで切り捨てられます。ページの最初のアンダースコアではありません。

エンコーディングの問題かもしれないと思ったので、UTF-8 と ISO-8859-1 の両方を試しましたが、まだ切り詰められています。Firefox でページを開くと、エンコーディングが ISO-8851-1 であると報告されます。

ご参考までに、Web ページはhttps://ricarichiamoci.dsu.pisa.it/ で、169 行目で切り捨てられます。

function ChangeOffset(NewOffset) {
  document.mainForm.last

代わりにあるべき場所

function ChangeOffset(NewOffset) {
  document.mainForm.last_record.value = NewOffset;

ページが切り捨てられた理由を知っている人はいますか?

4

1 に答える 1

7

ダウンロードしたページが切り捨てられていないことがわかりましたが、印刷に使用している関数 (Log.d) は文字列を切り捨てます。

したがって、ページのソース コードをダウンロードする方法は正常に機能していますが、Log.d() はおそらくそれほど多くのテキストを出力するためのものではありません。

于 2010-11-24T17:30:56.143 に答える