android OkHttp cookie 管理


android OkHttp cookie 管理

我現在有這樣一個需求,寫一個刷單APP,需要爬第三方平台的數據,大部分第三方網站登錄權限都是使用 cookie 來做的,當我使用 OKHttp 時,發現它默認沒有對 cookie 進行管理。可以通過 CookieJar 來實現:

package com.example.a01_webview;

import android.util.Log;
import android.webkit.JavascriptInterface;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class AndroidToJS extends Object {
    private String TAG = "AndroidToJS";

    // Cookie 管理
    private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .cookieJar(new CookieJar() {
                @Override
                public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
                   // 從響應頭中保存 cookie  
                    cookieStore.put(httpUrl.host(), list);
                }

                @Override
                public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                    // 添加 cookie  
                    List<Cookie> cookies = cookieStore.get(httpUrl.host());
                    return cookies != null ? cookies : new ArrayList<Cookie>();
                }
            })
            .build();

    @JavascriptInterface
    public void hello(String msg) {
        System.out.println("JS調用了Android的hello方法: " + msg);
    }

    /**
     * @desc 登錄獲取 cookie
     * @param configStr Http request config
     */
    @JavascriptInterface
    public void request(String configStr) {
        RequestBody requestBody = new FormBody.Builder()
                .add("mobile", "xxx")
                .add("password", "xxx")
                .add("code", "")
                .build();

        Request request = new Request.Builder()
                .url("https://m.kd321.cn/mobile/Login.aspx")
                .post(requestBody)
                .build();

        AndroidToJS mContext = this;

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, response.protocol() + " " +response.code() + " " + response.message());
                Headers headers = response.headers();
                for (int i = 0; i < headers.size(); i++) {
                    Log.d(TAG, headers.name(i) + ":" + headers.value(i));
                }
                Log.d(TAG, "onResponse: " + response.body().string());
                mContext.getTask();
            }
        });
    }

    /**
     * @desc 使用 cookie 獲取任務列表
     */
    public void getTask() {
        String url = "https://m.kd321.cn/mobile/tasklistLiuLiang.aspx";
        final Request request = new Request.Builder().get().url(url).build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, response.protocol() + " " +response.code() + " " + response.message());
                Headers headers = response.headers();
                for (int i = 0; i < headers.size(); i++) {
                    Log.d(TAG, headers.name(i) + ":" + headers.value(i));
                }
                Log.d(TAG, "onResponse: " + response.body().string());
            }
        });
    }
}

備注:這里封裝的方法,提供會給 WebView 使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM