1. 程式人生 > >okHttp的簡單運用以及cookie操作,302重定向死迴圈

okHttp的簡單運用以及cookie操作,302重定向死迴圈

為了完成學期實訓,需要對新浪新聞網站進行讀取,所以學習並封裝了okhttp簡單get和post的工具類。

本文參考了以下兩篇文章:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html

http://blog.csdn.net/lmj623565791/article/details/47911083

如果需要詳細的okhttp使用,建議看泡網的教程,需要完善的工具庫,請看我鴻洋大神的文章。

鴻洋大神的封裝太過完善- -很多東西app並用不到。。。

本著不能拿來主義,以及實用定製為主的精神,決定自行學習okhttp的使用。

關於專案中使用時發現的問題:

1.okhttp官方建議只使用一個client,但是對於訪問不同網站時cookie混亂,需要自行設定header來區分不同會話。

2.有些網站的登入驗證並不會返回網頁,直接在cookie中生成id區分是否登入成功,並且會造成302重定位死迴圈。

解決辦法當然是禁止自動跳轉,百度各種無解然後翻api發現了這個:mOkHttpClient.setFollowRedirects(followRedirects);

以上就是具體問題和解決,下面放出工具類:

package com.toxicant.hua.okhttpdemo;

import android.os.Handler;
import android.os.Looper;

import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import java.io.IOException;


/**
 * okhttp的get和post非同步的封裝
 * Created by hua on 2015/12/15.
 */
public class OkhttpUitls {

    private OkHttpClient mOkHttpClient=new OkHttpClient();
    private static OkhttpUitls mInstance=null;
    private String cookie="";//跨站點操作時需要對自行對不同cookie進行儲存,訪問時設定cookie以延續會話
    //獲取UI執行緒
    private Handler mHandler= new Handler(Looper.getMainLooper());
    //回撥介面
    interface MOkCallBack{
        void onSuccess(String str);
        void onError();
    }
    //獲取例項
    public static OkhttpUitls getInstance() {
        if (mInstance == null)
        {
            synchronized (OkhttpUitls.class)
            {
                if (mInstance == null)
                {
                    mInstance = new OkhttpUitls();
                }
            }
        }
        return mInstance;
    }

    /**
     * get方式進行網路訪問
     * @param url 地址
     * @param mCallBack 回撥
     */
    public void get(String url, final MOkCallBack mCallBack){
        final Request request = new Request.Builder()
                .url(url)
                .header("cookie", cookie)
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mCallBack.onError();
                    }
                });
            }

            @Override
            public void onResponse(final Response response) throws IOException {
                cookie=response.header("set-cookie");
                final String re=response.body().string();
                mHandler.post(new Runnable() {
                    public void run() {
                            mCallBack.onSuccess(re);
                    }
                });
            }
        });
    }//get

    /**
     * post方式進行網路訪問
     * @param url 地址
     * @param data 回撥
     * @param mCallBack 介面
     */

    public void post(String url,RequestBody data,final MOkCallBack mCallBack){
        final Request request = new Request.Builder()
                .url(url)
                .header("cookie", cookie)
                .post(data)
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mCallBack.onError();
                    }
                });
            }

            @Override
            public void onResponse(final Response response) throws IOException {
                cookie=response.header("set-cookie");
                final String re=response.body().string();
                mHandler.post(new Runnable() {
                    public void run() {
                        mCallBack.onSuccess(re);
                    }
                });
            }

        });

    }//post

    /**
     * 獲取當前使用的cookie
     * @return cookie
     */
    public String getCookie() {
        return cookie;
    }

    /**
     * 設定下次訪問網路的cookie,設定為""空文字則清除cookie
     * @param cookie 要設定的cookie
     */
    public void setCookie(String cookie) {
        this.cookie = cookie;
    }

    /**
     * 設定要不要自動跟隨302重定向,預設為真
     * @param followRedirects 是否自動跳轉
     */
    public void setFollowRedirects(boolean followRedirects) {
        mOkHttpClient.setFollowRedirects(followRedirects);
    }

}
使用方法:可以直接進行ui操作
 uitls.get("http://www.baidu.com",new OkhttpUitls.MOkCallBack() {
                    @Override
                    public void onSuccess(String str) {
                        tv.setText(str);
                        Log.i("cookie","cookie->"+uitls.getCookie());
                    }

                    @Override
                    public void onError() {
                        tv.setText("error");
                    }

                });
post方法比get多了一個data引數
 RequestBody data=new FormEncodingBuilder()            
	            .add("name", "android")
                       .add("psw", "123456")
                        .build();
如上構造鍵值對,然後傳入就行。

在上傳json資料時,data引數應該這樣封裝:

final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
 RequestBody data = RequestBody.create(JSON, json);

最後附上okhttp的git專案原地址

https://github.com/square/okhttp

相關推薦

okHttp簡單運用以及cookie操作302定向迴圈

為了完成學期實訓,需要對新浪新聞網站進行讀取,所以學習並封裝了okhttp簡單get和post的工具類。 本文參考了以下兩篇文章: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.ht

oauth X-Frame-Options 跳轉授權頁面時302定向禁用iframe

授權 ngx auth option rest pairs 測試 authorize iframe 因為oauth/authorize響應頭包含X-Frame-Options: DENY解決方案:openresty nginx 移除該屬性,經測試生效 more_clear

shell指令碼實現簡單的模擬使用者操作未加檢查點。

計次失敗:counter+1,輸出的一直是times==0 shell指令碼: echo about eyelock counter=0 am start --activity-single-top -n com.android.settings/com.android.s

Python爬蟲請求頭、請求代理以及cookie操作

·爬蟲程式urllib2模組底層操作; ·請求頭的設定和新增; ·請求代理的種類和型別; ·關於cookie的操作(手動新增/程式自動獲取) 一、爬蟲底層操作和請求頭的設定 1.demo01_爬蟲底層操作 雖然urllib2模組是爬蟲的底層操作,但並不是程式的底層

OkHttp簡單封裝以及快取設定

廢話不說,上程式碼:package com.jiyun.kaishu.Model;import android.content.Context;import android.util.Log;import java.io.File;import java.io.IOExcep

java中httpclent以post方式提交請求時http返回碼是302定向不自動跳轉的處理

場景: 介面A:請求地址為http://www.test.com/test 介面A的功能,會把接收到的引數url寫入到header的Location屬性中 在java中,使用httpclient傳送請求, 在以get方式傳送請求時,http的返回碼是200,自動處理了重定

關於爬蟲模擬美團登陸後解決302定向的問題的方法

在使用requests中的方法模擬登陸,沒有用scrapy中本來的方法。 self.session.get(self.get_url, data=post_data, headers=self.headers) 登陸之後去請求下一個連結的時候,就會出現下面的錯誤 scr

jsp reuest轉發response定向 以及pageContext對forward和include的簡寫

response.sendRedirect("apage.jsp");//servlet重定向到apage.jsp request.getRequestDispatcher("apage.jsp").forward(request, response);//servlet

關於vue-router路由定向的使用分析

log mage bsp 但是 完美解決 outer 方法 解決 問題 看之前的項目,突然發現一個不算bugd的bug,之前也是一直沒有想到,現在發現之後越來越覺得有必要改掉, 如圖,項目用的是vue做的,自然切換用的就是路由,一級路由包括:首頁、記錄和個人中心,二級路由

改變querystring值然後定向

red chang system rep exchange repl bject tar object 原文發布時間為:2009-11-13 —— 來源於本人的百度文章 [由搬家工具導入] 本页面改变qu

302定向、喜馬音樂

param chrom curl sde serve track os.chdir () 內存耗盡 # 重定向: def redirect(url): r = requests.get(url,params={‘chrome‘:‘utf-8‘, ‘q‘:‘666

LAMP架構(apache用戶認證域名定向apache訪問日誌)

apache用戶認證 域名重定向 apache訪問日誌 一、apache用戶認證用戶認證就是打開一個網站。會讓你輸入用戶名和密碼。對了才會讓你訪問HTTP,vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf編輯內容如下<Director

微信小程序開發--路由切換頁面定向

code gate 詳細 rec 遇到 request tabbar 絕對路徑 api 這段時間開發了一個微信小程序,雖然小程序的導航API 官方文檔寫得很詳細,但是在具體開發過程中還是會遇到很多不明白,或者一時轉不過彎的地方。 1、頁面切換傳參,參數讀取    1.1

scrapy 解決302定向問題

stat lba hand edi scrapy pytho sta art true def start_requests(self): for i in self.start_urls: yield Request(i,

關於ios 11.X後微信wifi認證無法打開微信無法定向到weixin:開頭網址等問題的處理

width 問題 aos 開頭 優化 重定向 bubuko gin indexof 環境:   認證路由ROS ,認證後臺python django ios11系統 更新以來先後出現微信wifi認證,無法打開微信,無法重定向到weixin:開頭網址等相關問題。 經

Python requests jira登入302定向

總結一下自己在用Python requests庫對jira進行的一個bug統計時,在登入遇到的問題,以前也遇到過登入302重定向的問題,那個時候用requests同樣的方法沒有獲取到cookie,但是jira可以用requests獲取到cookie,我也不知道怎麼回事 網上百度了很多資料,好多都是用jira

關於ios 11.X後微信wifi認證無法開啟微信無法定向到weixin:開頭網址等問題的處理

環境:   認證路由ROS ,認證後臺python django ios11系統 更新以來先後出現微信wifi認證,無法開啟微信,無法重定向到weixin:開頭網址等相關問題。     經過問題的收集,查詢到網路上此類問題普遍存在 收集到的有如下網址,市面上大多數廠商在使用

WDCP配置ThinkPHP偽靜態隱藏index.php解決定向次數過多

修改檔案專案入口檔案 # 把tp50專案public目錄所有檔案複製到public_html,修改index.php入口檔案路徑,所有的..修改為當前目錄/ 配置nginx配置 # 在wdcp裡面,檔案管理>nginx配置(檔案: /www/w

Linux(小專案)————shell的實現包含定向、內建命令。

bash原理: 通過上面bash的原理我們可以,瞭解到shell的框架與流程: 1.等待使用者輸入命令。 2.解析使用者輸入的字串。 3.建立子程序執行exec程式替換 4.父程序等待子程序退出。 迴圈執行1~4步驟,即可完成my_shell。 最簡單版本的my_shell實現:

使用Kong的oauth2.0請求定向url返回“no route and no API found with those values”

官方提供的endpoints有兩個:/oauth2/authorize 以及 /oauth2/token。(詳情請看:https://docs.konghq.com/hub/kong-inc/oauth2/) 注意事項有以下3點: 1、如果api添加了“uris”,比如“/test",那麼訪問的