0

Web サービスを使用するクライアントを構築しています。私がしなければならないことの 1 つは、POST 要求を送信してから、返された Cookie を保存することです。curl コマンドを使用して送信すると、応答を取得するのに約 2 秒もかかりません。これは私が使用したコマンドです:

curl -c cookies.txt --cert client_certificate -X POST -H "Content-Type: application/json" -d 'request_body' "https://my_target_web_service"

しかし、Apache httpclient (4.3.1) を使用すると、約 5 秒かかります。方法は次のとおりです。

@Test
public void firstCall() throws Exception {
    final String url = "https://my_target_web_service";
    final String requestBody = readFile("json/request_body.json");
    Executor executor = executor();
    CookieStore cookieStore = new BasicCookieStore();
    executor.cookieStore(cookieStore);

    Request request = Request.Post(url).bodyString(requestBody, ContentType.APPLICATION_JSON);
    LOG.debug(request.toString());

    Response response = executor.execute(request);
    LOG.info(response.returnResponse().getStatusLine().toString());
}

private Executor executor() throws Exception {
    KeyStore clientStore = secretKeyStore();
    SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(clientStore, "secret_key".toCharArray()).useTLS().build();
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
            SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
    Executor executor = Executor.newInstance(httpclient);
    return executor;
}

LOG 出力は、Web サービスへの接続の確立にほとんどの時間が費やされていることを示しています (15:44:12,610 から 15:44:17,426 へのジャンプに注意してください)。

DEBUG [2013-10-16 15:44:12,485] [main                          ] org.apache.http.client.protocol.RequestAddCookies: CookieSpec selected: best-match
DEBUG [2013-10-16 15:44:12,500] [main                          ] org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Connection request: [route: {s}->https://...:443][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]
DEBUG [2013-10-16 15:44:12,517] [main                          ] org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Connection leased: [id: 0][route: {s}->https://...:443][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
DEBUG [2013-10-16 15:44:12,524] [main                          ] org.apache.http.impl.execchain.MainClientExec: Opening connection {s}->https://...:443
DEBUG [2013-10-16 15:44:12,610] [main                          ] org.apache.http.conn.HttpClientConnectionManager: Connecting to ...:443
DEBUG [2013-10-16 15:44:17,426] [main                          ] org.apache.http.impl.execchain.MainClientExec: Executing request POST / HTTP/1.1
DEBUG [2013-10-16 15:44:17,427] [main                          ] org.apache.http.impl.execchain.MainClientExec: Target auth state: UNCHALLENGED
DEBUG [2013-10-16 15:44:17,427] [main                          ] org.apache.http.impl.execchain.MainClientExec: Proxy auth state: UNCHALLENGED

私が見逃していることや間違っていることを誰かに教えてもらえますか? それとも、これは httpclient や Java の制限ですか?

ありがとう、

4

0 に答える 0