您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在Android中使用OkHttp進行重定向攔截處理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
步驟:
自己做POST請求,并且不讓它自動重定向
我們拿到POST請求返回來的響應,獲取對應的Set-Cookie字段的內容
將該對應的內容添加到GET請求的Cookie請求頭字段中,然后做GET請求
獲取到的GET請求的響應體就是我們登陸后的網頁內容了,如果是靜態網頁可以通過Jsoup解析自己想要的信息了
我們需要通過抓包或者Chorme瀏覽器自帶的請求查看功能來查看POST請求提交的表單是怎樣的。Chorme按F12即可
輸入帳號密碼點擊登錄即可
點擊登陸后我們可以看到,控制面板出現了一堆訪問的記錄,第一個就是我們要找的,第一個的Status標志是302,302是重定向的意思。我們點擊(pass.asp)這個請求,然后查看它的POST的請求頭(點擊Headers)。
我們看到了一堆的Set-Cookie字段,字段對應的內容就是我們要攜帶做GET請求的
同時我們可以看到POST提交的表單內容,有些網站的提交參數是經過加密的,如果要做通用的,我們需要找到它加密的方法,做同樣的加密處理。
接下來使用OkHttp進行操作
由于OkHttp提供了自動攜帶Cookie進行請求的功能,于是我們可以很方便地進行處理了。
final OkHttpClient client = new OkHttpClient().newBuilder() .followRedirects(false) //禁制OkHttp的重定向操作,我們自己處理重定向 .followSslRedirects(false) .cookieJar(new LocalCookieJar()) //為OkHttp設置自動攜帶Cookie的功能 .build(); //CookieJar是用于保存Cookie的 class LocalCookieJar implements CookieJar{ List<Cookie> cookies; @Override public List<Cookie> loadForRequest(HttpUrl arg0) { if (cookies != null) return cookies; return new ArrayList<Cookie>(); } @Override public void saveFromResponse(HttpUrl arg0, List<Cookie> cookies) { this.cookies = cookies; } }
為什么設置CookieJar就能自動攜帶Cookie了呢?給你看一段OkHttp的源碼就知道了。
/** * Populates request with defaults and cookies. * * <p>This client doesn't specify a default {@code Accept} header because it doesn't know what * content types the application is interested in. */ private Request networkRequest(Request request) throws IOException { Request.Builder result = request.newBuilder(); //如果CookieJar的Cookie不為空,則設置Cookie字段 List<Cookie> cookies = client.cookieJar().loadForRequest(request.url()); if (!cookies.isEmpty()) { result.header("Cookie", cookieHeader(cookies)); } return result.build(); }
于是接下來我們就是做POST請求了
final OkHttpClient client = new OkHttpClient().newBuilder() .followRedirects(false) .followSslRedirects(false) .cookieJar(new LocalCookieJar()) .build(); //構造一個POST請求 RequestBody body = new FormBody.Builder().add("UserStyle", "student") .add("user", "xxx").add("password", "xxx").build(); Request request = new Request.Builder().url("http://222.195.8.201/pass.asp").post(body).build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { /** * 如果不用CookieJar,那么就要自己去解析返回的Set-Cookie字段,解析之后通過addHeader("Cookie", cookie) * 添加Cookie請求頭 */ // List<String> cookies = response.headers("Set-Cookie"); // String cookie = ""; // for(int i=cookies.size()-1; i>=0; i--){ // cookie = cookie+ cookies.get(i).replace("path=/", "") + " "; // } //做GET請求 Request redirectRequest = new Request.Builder().url("http://222.195.8.201/student/asp/Select_Success.asp") // .addHeader("Cookie", cookie) .build(); //拿到登陸后操作的某個網頁的內容 Response response2 = client.newCall(redirectRequest).execute(); String result = response2.body().string(); System.out.println(result); } @Override public void onFailure(Call arg0, IOException arg1) { } });
Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
看完上述內容,你們對怎么在Android中使用OkHttp進行重定向攔截處理有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。