2015-10-22 31 views
3

如何通过okHttp重用http保持连接?Java 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()方法。在此方法中打开连接,创建服务器端的会话并接收sessionId的cookie。

但是,当我对服务器执行另一个查询时 - 我以前的连接未使用,服务器上的会话已关闭。在服务器中的会话生命时间不小,所以问题不在生活中。 PS:我从服务器获取验证码并识别验证码,然后使用验证码对服务器执行查询。但是,服务器端的验证码不被识别,因为会话已经关闭,验证码存储在会话中。

+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对象。