2014-06-17 5 views
40

स्क्वायर https://github.com/square/okhttp द्वारा OkHttp का उपयोग करना, कैसे कर सकते हैं मैं:OkHttp का उपयोग कर एंड्रॉइड पर कुकी हैंडलिंग को कैसे कार्यान्वित करें?

  1. पुनः प्राप्त एक कुकी सर्वर
  2. स्टोर आगामी अनुरोध
  3. उपयोग अनुवर्ती अनुरोधों
  4. अद्यतन कुकी में संग्रहीत कुकी के लिए कुकी से लौटे बाद के अनुरोध

आदर्श रूप से कुकी को प्रत्येक रिक के साथ स्वचालित रूप से संग्रहीत, नाराज और अपडेट किया जाएगा uest।

उत्तर

33

प्री ओकेएचटीपी 3, आप अपने ओकेएचटीपी क्लाइंट उदाहरण में कुकी हेन्डलर पास कर सकते हैं। आप java.net से कुकी मैनेजर कार्यान्वयन का उपयोग कर सकते हैं या यदि आप चाहें तो अपना खुद का कार्यान्वयन कर सकते हैं। ऐसी नीति चुनें जो आपकी आवश्यकताओं के लिए सबसे अच्छा काम करे।

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

ओकेएचटीपी प्रतिक्रियाओं से प्राप्त कुकीज को कुकी हेन्डलर में सहेज लेगा और अनुरोध भेजते समय इसे पढ़ेगा। यह मेलिंग अनुरोध/प्रतिक्रिया यूआरआई के लिए ऐसा करेगा।

+26

ध्यान देने योग्य महत्वपूर्ण: कुकी मैनेजर लगातार नहीं है। अगली बार जब आप अपना ऐप लॉन्च करेंगे, तो कुकी जार खाली हो जाएगा। –

+0

@ जेसे विल्सन, तो इसे लगातार कैसे बनाया जाए? –

+0

लगातार कुकीज़ अभी तक कार्यान्वित नहीं की गई हैं। यदि आपको एम की आवश्यकता है, तो आपको अपना खुद का कुकीस्टोर बनाना होगा। –

53

OkHttp3 लिए, एक साधारण स्वीकार-सब, गैर लगातार CookieJar कार्यान्वयन के रूप में किया जा सकता है इस प्रकार है:

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(); 

या आप java.net.CookieManager उपयोग करने के लिए पसंद करते हैं, अपनी परियोजना है, जो JavaNetCookieJar होता है, एक आवरण में okhttp-urlconnection शामिल वर्ग कि 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

तो स्वचालित रूप से बचाता है और मुझे कुछ भी नहीं करना है? काम शुरू करने के बाद? – user3871754

+1

कोई उदाहरण गैर-लगातार कुकी जार के लिए नहीं है। लगातार समाधान के लिए, आप अपना खुद का कार्यान्वयन कर सकते हैं, उदा। http://stackoverflow.com/a/25462286/836540, और इसे JavaNetCookieJar से लपेटें। – hidro

+15

बीटीडब्ल्यू, यूआरएल सर्वर के लिए 'पूर्ण यूआरएल' है और यह उसी यूआरएल को अनुरोध करते समय केवल कुकीज़ भेज देगा। आप 'cookieStore.put (url, कुकीज़) को प्रतिस्थापित करना चाहते हैं;' 'कुकी'Store.put (url.host(), कुकीज़); 'loadForRequest के लिए,' coookieStore.get (url.host());'। और 'हैश मैप > 'to' हैश मैप ' – LETs

3

मुझे डिफ़ॉल्ट कुकी जार (कुकी मैनेजर.getInstance()) साझा करने की आवश्यकता है, इसलिए यह मेरे लिए ठीक काम करना प्रतीत होता था।

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

धन्यवाद यह वास्तव में ठीक काम करता है। अच्छा काम। सरल समाधान, धन्यवाद !! – KZoNE

संबंधित मुद्दे