1

私は 2 つの異なる方法で HttpClient を定義します。2. スレッドセーフ:

DefaultHttpClient getThreadSafeHttpClient() {
    HttpParams params = new BasicHttpParams();
    params
            .setParameter(
                    "http.useragent",
                    "Mozilla/5.0 (Linux; U; Android 1.1; en-us;dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2");
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, "UTF-8");
    final SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));
    final ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params,
            registry);
    return new DefaultHttpClient(manager, params);
}

次に、両方のクライアント タイプに対して同じ JUnit テストを実行します (単純な GET 要求)。#1 は常に正常に実行され、#2 は常に「java.net.SocketException: Connection reset」で失敗します。デバッグ/スタック トレースの出力は、ここ(架空のサイト)で確認できます。

client#execute 呼び出しでエラーがスローされるため、エンティティ オブジェクトを操作する機会がありません。ここで何が間違っているのですか?

4

1 に答える 1

2

あはは!その理由は、間違ったソケットファクトリでHTTPSを定義したためです。SSLSocketFactoryである必要があります

SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
sslSocketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
registry.register(new Scheme("https", sslSocketFactory, 443));
于 2009-08-27T18:55:43.050 に答える