2015-10-22 8 views
3

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

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

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: Я получаю captcha с сервера и распознаю код captcha, а затем выполняю запрос с кодом captcha на сервер. Но captcha на стороне сервера не распознается, потому что сессия уже закрыта и код captcha хранится в сеансе.

+0

любая работа вокруг? –

+0

Я столкнулся с той же проблемой в Android. вы нашли решение еще? –

+0

К сожалению нет. – Vusal

ответ

0

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

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 объекта.