Java okHttp повторно использовать keep-alive соединение

Как повторно использовать http keep-alive соединение через okHttp?

Мой пример кода:

public class MainWithOkHttp {

    static OkHttpClient _client = new OkHttpClient();

    public static void main(String[] args) {
        ...
        query1();
        ...
        // in this request
        Request _request = new Request.Builder()
            .url("...")
            .addHeader("connection", "keep-alive")
            .addHeader("cookie", _cookie)
            .post(postParams)
            .build();
        // in this request my previous session is closed, why?
        // my previous session = session created in query1 method
        Response _response = _client.newCall(_request).execute();
        ...
    }

    ...
    private static void query1() {
        ...
        Request request = new Request.Builder()
            .url("...")
            .addHeader("connection", "keep-alive")
            .addHeader("cookie", _cookie)
            .get()
            .build();
        Response _response = _client.newCall(request).execute();
        ...
    }
    ...

}

Итак, я звоню query1() метод. В этом методе соединение открывается, создается сеанс на стороне сервера и получен cookie с sessionId.

Но, когда я выполняю другой запрос к серверу - мое предыдущее соединение не используется и сессия на сервере уже закрыта. Время жизни сессии на сервере не маленькое, поэтому проблема не в времени жизни.

PS: Я получаю капчу с сервера и распознаю код капчи, затем выполняю запрос с кодом капчи на сервер. Но капча на стороне сервера не распознается, потому что сессия уже закрыта, а код капчи сохранен в сессии.

1 ответ

Решение

В конце концов, следующий код работает для меня:

public class Main {

  static OkHttpClient _client = new OkHttpClient();

  public static void main(String[] args) throws IOException {
      performQuery();
  }

  private static void performQuery() throws IOException {
      Request firstRequest = new Request.Builder()
            .url("http://localhost/test/index.php")
            .get()
            .build();
      Response firstResponse = _client.newCall(firstRequest).execute();

      Request.Builder requestBuilder = new Request.Builder()
            .url("http://localhost/test/index.php");

      Headers headers = firstResponse.headers();

      requestBuilder = requestBuilder.addHeader("Cookie", headers.get("Set-Cookie"));

      Request secondRequest = requestBuilder.get().build();
      Response secondResponse = _client.newCall(secondRequest).execute();
  }
}

Кажется, проблема была с _cookie объект.

Другие вопросы по тегам