Volley加載并讀取cookies數(shù)據(jù)

微博開發(fā)api限制太多,準(zhǔn)備直接爬網(wǎng)頁數(shù)據(jù)了,然而微博基本是用cookies當(dāng)token,于是需要改一改volley請求
(android用cookies真的麻煩,python一個session就解決了,甚至想直接內(nèi)嵌py代碼)

  • 很簡單,在想讀取cookies的StringRequest中,重寫一下 parseNetworkResponse
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                HashMap<String, String> cookieMap = new HashMap<>();
                for (int i = 0, n = response.allHeaders.size(); i < n; i++){
                    Header h = response.allHeaders.get(i);
                    if (h.getName().equalsIgnoreCase("Set-Cookie")){
                        if (h.getValue() != null){
                            String firstItem = h.getValue().substring(0, h.getValue().indexOf(';'));
                            String []cookiePair = firstItem.split("=");
                            if (cookiePair.length == 2){
                                cookieMap.put(cookiePair[0], cookiePair[1]);
                            }
                        }
                    }
                }
                if (response.statusCode == 200){
                    Log.i("Login","登錄成功");
                }else {
                    Log.e("Login","登錄失敗!!");
                }
                // Cookie保存
                StringBuilder stringBuilder = new StringBuilder();
                for (Map.Entry<String, String> entry : cookieMap.entrySet()){
                stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append(";");
                }
                // 這里寫了個putCookies的方法來保存cookies
                if(!putCookies(context, stringBuilder.toString())){
                    Log.e("LoginCookies","保存cookies失敗");
                }
                return super.parseNetworkResponse(response);
            }

里面stringbuilder中cookies格式為cookie1=value1;cookie2=value2;cookie3=value3;

  • 使用的時候重寫getHeaders:
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                return LoginUtils.getCookies(getApplicationContext());
            }

return中就是需要加入的cookies,數(shù)據(jù)格式為map<String, String>, LoginUtils.getCookies如下

    public static Map<String, String> getCookies(Context context) {
        SharedPreferences sp = context.getSharedPreferences("Cookies", Context.MODE_PRIVATE);
        String cookies = sp.getString("cookies", "");
        if (!cookies.equals("")){
            Log.i("Login", "getCookies");
            Map<String, String> map = new HashMap<String, String>();
            map.put("cookie", cookies);
            return map;
        }else {
            Log.e("Login", "Cookies不存在");
            return null;
        }
    }

即在volley里使用cookies的方法為,將cookiesmap<K,V>形式加入到headers中,其中K一般為cookie, 而V可包括多條cookies, 格式為:cookie1=value1;cookie2=value2;cookie3=value3;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容