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