2014-06-17 11 views

risposta

33

Pre OkHttp 3, è possibile passare un CookieHandler all'istanza OkHttpClient. È possibile utilizzare l'implementazione di CookieManager da java.net o implementare la propria se lo si desidera. Scegli la politica più adatta alle tue esigenze.

OkHttpClient client = new OkHttpClient(); 
CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
client.setCookieHandler(cookieManager); 

OkHttp salverà cookie ricevuti dalle risposte nel CookieHandler e leggere da quando l'invio di richieste. Lo farà per abbinare URI richiesta/risposta.

+26

Importante da notare: CookieManager non è persistente. La prossima volta che avvierai la tua app, il cookie jar sarà vuoto. –

+0

@JesseWilson, quindi come renderlo persistente? –

+0

I cookie persistenti non sono ancora stati implementati. Se ti serve, devi creare il tuo CookieStore. –

53

Per OkHttp3, un semplice accettare il tutto, non-persistenti CookieJar implementazione può essere la seguente:

OkHttpClient client = new OkHttpClient.Builder() 
    .cookieJar(new CookieJar() { 
     private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>(); 

     @Override 
     public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { 
      cookieStore.put(url, cookies); 
     } 

     @Override 
     public List<Cookie> loadForRequest(HttpUrl url) { 
      List<Cookie> cookies = cookieStore.get(url); 
      return cookies != null ? cookies : new ArrayList<Cookie>(); 
     } 
    }) 
    .build(); 

O se si preferisce utilizzare java.net.CookieManager, includere okhttp-urlconnection nel progetto, che contiene JavaNetCookieJar, un wrapper classe che i delegati a java.net.CookieHandler:

dependencies { 
    compile "com.squareup.okhttp3:okhttp:3.0.0" 
    compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0" 
} 

CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
OkHttpClient client = new OkHttpClient.Builder() 
    .cookieJar(new JavaNetCookieJar(cookieManager)) 
    .build(); 
+0

Quindi salva automaticamente e nulla devo fare? Dopo il riavvio funziona? – user3871754

+1

Nessun esempio è per cookie jar non persistenti. Per la soluzione persistente, puoi implementare la tua, ad es. http://stackoverflow.com/a/25462286/836540 e avvolgilo con JavaNetCookieJar. – hidro

+15

Btw, url è un 'URL COMPLETO' per il server e invierà solo cookie quando si effettua la richiesta di esatto stesso URL. Si potrebbe voler sostituire 'cookieStore.put (url, cookie);' a 'cookieStore.put (url.host(), cookie);' Per loadForRequest, 'coookieStore.get (url.host());'. E Sostituisci 'HashMap >' a 'HashMap ' – LETs

3

Avevo bisogno di condividere il Cookie Jar predefinito (CookieManager.getInstance()), quindi sembrava funzionare bene per me.

return new CookieJar() { 

     @Override 
     public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { 
      CookieManager cookieManager = CookieManager.getInstance(); 

      for (Cookie cookie : cookies) { 
       cookieManager.setCookie(url.toString(), cookie.toString()); 
      } 
     } 

     @Override 
     public List<Cookie> loadForRequest(HttpUrl url) { 
      CookieManager cookieManager = CookieManager.getInstance(); 
      List<Cookie> cookies = new ArrayList<>(); 
      if (cookieManager.getCookie(url.toString()) != null) { 
       String[] splitCookies = cookieManager.getCookie(url.toString()).split("[,;]"); 
       for (int i=0; i<splitCookies.length; i++) { 
        cookies.add(Cookie.parse(url, splitCookies[i].trim())); 
       } 
      } 
      return cookies; 
     } 
    }; 
+0

Grazie Funziona davvero bene. Ottimo lavoro. Soluzione semplice, grazie !! – KZoNE

Problemi correlati