Android -Okhttp框架 工具類

網(wǎng)絡(luò)請(qǐng)求的封裝

package com.lt.okhttpfirst.helper;


import android.content.Context;

import com.squareup.okhttp.Cache;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ResponseBody;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

/**
 * Created by 風(fēng)情萬(wàn)種冷哥哥 on 2016/10/17.
 */
public class OkHttpClientHelper {
    private static OkHttpClient mOkHttpClient = null;
    private static OkHttpClientHelper mOkHttpUtils = null;

    private OkHttpClientHelper(Context context) {
        mOkHttpClient = getOkHttpSingletonInstance();

        //開啟響應(yīng)緩存
        mOkHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
        //設(shè)置緩存目錄和大小
        int cacheSize = 10 << 20; // 10 MiB
        Cache cache = new Cache(context.getCacheDir(), cacheSize);
        mOkHttpClient.setCache(cache);

        //設(shè)置合理的超時(shí)
        mOkHttpClient.setConnectTimeout(15, TimeUnit.SECONDS);
        mOkHttpClient.setReadTimeout(20, TimeUnit.SECONDS);
        mOkHttpClient.setWriteTimeout(20, TimeUnit.SECONDS);

        //以下驗(yàn)證不設(shè)置素征,那么默認(rèn)就已經(jīng)設(shè)置了驗(yàn)證
        mOkHttpClient.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
    }

    public static OkHttpClientHelper getOkHttpClientUtils(Context context) {
        if (mOkHttpUtils == null) {
            synchronized (OkHttpClientHelper.class) {
                if (mOkHttpUtils == null) {
                    mOkHttpUtils = new OkHttpClientHelper(context);
                }
            }
        }
        return mOkHttpUtils;
    }

    public static OkHttpClient getOkHttpSingletonInstance() {
        if (mOkHttpClient == null) {
            synchronized (OkHttpClient.class) {
                mOkHttpClient = new OkHttpClient();
            }
        }
        return mOkHttpClient;
    }

    ///////////////////////////////////////////////////////////////////////////
    // GET方式網(wǎng)絡(luò)訪問(wèn)
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 基方法集嵌,返回Request對(duì)象
     *
     * @param urlString
     * @param tag
     * @return
     */
    private Request buildGetRequest(String urlString, Object tag) {
        Request.Builder builder = new Request.Builder();
        builder.url(urlString);
        if (tag != null) {
            builder.tag(tag);
        }
        return builder.build();
    }

    /**
     * 自定義方法,返回Response對(duì)象
     *
     * @param urlString
     * @return
     * @throws IOException
     */
    private Response buildResponse(String urlString, Object tag) throws IOException {
        Request request = buildGetRequest(urlString, tag);
        Response response = mOkHttpClient.newCall(request).execute();
        return response;
    }

    //基礎(chǔ)方法御毅,返回ResponseBody對(duì)象
    private ResponseBody buildResponseBody(String urlString, Object tag) throws IOException {
        Response response = buildResponse(urlString, tag);
        if (response.isSuccessful()) {
            return response.body();
        }
        return null;
    }

    /**
     * 作用:實(shí)現(xiàn)網(wǎng)絡(luò)訪問(wèn)文件根欧,將獲取到數(shù)據(jù)儲(chǔ)存在文件流中
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @return InputStream
     */
    public static InputStream getStreamFromURL(Context context, String urlString, Object tag)
            throws IOException {
        ResponseBody body = getOkHttpClientUtils(context).buildResponseBody(urlString, tag);
        if (body != null) {
            return body.byteStream();
        }
        return null;
    }

    /**
     * 作用:實(shí)現(xiàn)網(wǎng)絡(luò)訪問(wèn)文件,將獲取到的數(shù)據(jù)存在字節(jié)數(shù)組中
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @return byte[]
     */
    public static byte[] getBytesFromURL(Context context, String urlString, Object tag) throws
            IOException {
        ResponseBody body = getOkHttpClientUtils(context).buildResponseBody(urlString, tag);
        if (body != null) {
            return body.bytes();
        }
        return null;
    }

    /**
     * 作用:實(shí)現(xiàn)網(wǎng)絡(luò)訪問(wèn)文件端蛆,將獲取到的數(shù)據(jù)存在字符串中
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @return String
     */
    public static String getStringFromURL(Context context, String urlString, Object tag) throws
            IOException {
        ResponseBody body = getOkHttpClientUtils(context).buildResponseBody(urlString, tag);
        if (body != null) {
            return body.string();
        }
        return null;
    }

    ///////////////////////////////////////////////////////////////////////////
    // POST方式訪問(wèn)網(wǎng)絡(luò)
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 基方法凤粗,返回Request對(duì)象
     *
     * @param urlString
     * @param tag
     * @return
     */
    private Request buildPostRequest(String urlString, RequestBody requestBody, Object tag) {
        Request.Builder builder = new Request.Builder();
        builder.url(urlString).post(requestBody);
        //builder.addHeader("Accept", "application/json; q=0.5");
        if (tag != null) {
            builder.tag(tag);
        }
        return builder.build();
    }

    /**
     * 作用:post提交數(shù)據(jù),返回服務(wù)器端返回的字節(jié)數(shù)組
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @return byte[]
     */
    private String postRequestBody(String urlString, RequestBody requestBody, Object tag) {
        Request request = buildPostRequest(urlString, requestBody, tag);
        try {
            Response response = mOkHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                return response.body().string();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 作用:POST提交鍵值對(duì)今豆,再返回相應(yīng)的數(shù)據(jù)
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @param map       :訪問(wèn)url時(shí)嫌拣,需要傳遞給服務(wù)器的鍵值對(duì)數(shù)據(jù)。
     * @return String
     */
    public static String postKeyValuePair(Context context, String urlString, Map<String, String>
            map, Object tag) {
        //往FormEncodingBuilder對(duì)象中放置鍵值對(duì)
        FormEncodingBuilder formBuilder = new FormEncodingBuilder();
        if (map != null && !map.isEmpty()) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                formBuilder.add(entry.getKey(), entry.getValue());
            }
        }
        //生成請(qǐng)求體對(duì)象
        RequestBody requestBody = formBuilder.build();
        //將請(qǐng)求提放置到請(qǐng)求對(duì)象中
        return getOkHttpClientUtils(context).postRequestBody(urlString, requestBody, tag);
    }

    /**
     * 作用:POST提交Json字符串呆躲,再返回相應(yīng)的數(shù)據(jù)
     *
     * @param urlString  :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @param jsonString :訪問(wèn)url時(shí)异逐,需要傳遞給服務(wù)器的json字符串
     * @return byte[]
     */
    public static String postJsonString(Context context, String urlString, String jsonString,
                                        Object tag) {
        //定義mimetype對(duì)象
        /*String MEDIA_TYPE_STREAM = "application/octet-stream;charset=utf-8";
        String MEDIA_TYPE_STRING = "text/plain;charset=utf-8";*/
        String MEDIA_TYPE_JSON = "application/json;charset=utf-8";
        MediaType JSON = MediaType.parse(MEDIA_TYPE_JSON);
        RequestBody requestBody = RequestBody.create(JSON, jsonString);
        return getOkHttpClientUtils(context).postRequestBody(urlString, requestBody, tag);
    }

    ///////////////////////////////////////////////////////////////////////////
    // 異步網(wǎng)絡(luò)訪問(wèn)
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 開啟異步線程訪問(wèn)網(wǎng)絡(luò),通過(guò)回調(diào)方法實(shí)現(xiàn)數(shù)據(jù)加載
     * 如果第二個(gè)參數(shù)為null插掂,空callback灰瞻, 則說(shuō)明不在意返回結(jié)果
     *
     * @param urlString
     * @param callback
     */
    public static void getDataAsync(Context context, String urlString, Callback callback, Object
            tag) {
        Request request = getOkHttpClientUtils(context).buildGetRequest(urlString, tag);
        getOkHttpSingletonInstance().newCall(request).enqueue(callback);
    }

    /**
     * 作用:post提交數(shù)據(jù),返回服務(wù)器端返回的字節(jié)數(shù)組
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     */
    private void postRequestBodyAsync(String urlString, RequestBody requestBody, Callback
            callback, Object tag) {
        Request request = buildPostRequest(urlString, requestBody, tag);
        if (callback == null) {
            new Callback() {

                @Override
                public void onFailure(Request request, IOException e) {

                }

                @Override
                public void onResponse(Response response) throws IOException {

                }
            };
        }
        mOkHttpClient.newCall(request).enqueue(callback);
    }

    /**
     * 作用:POST提交鍵值對(duì),再返回相應(yīng)的數(shù)據(jù)
     *
     * @param urlString :訪問(wèn)網(wǎng)絡(luò)的url地址
     * @param map       :訪問(wèn)url時(shí)箩祥,需要傳遞給服務(wù)器的鍵值對(duì)數(shù)據(jù)院崇。
     */
    public static void postKeyValuePairAsync(Context context, String urlString, Map<String,
            String> map, Callback callback, Object tag) {
        //往FormEncodingBuilder對(duì)象中放置鍵值對(duì)
        FormEncodingBuilder formBuilder = new FormEncodingBuilder();
        if (map != null && !map.isEmpty()) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                formBuilder.add(entry.getKey(), entry.getValue());
            }
        }
        //生成請(qǐng)求體對(duì)象
        RequestBody requestBody = formBuilder.build();
        //將請(qǐng)求提放置到請(qǐng)求對(duì)象中
        getOkHttpClientUtils(context).postRequestBodyAsync(urlString, requestBody, callback, tag);
    }

    /**
     * 作用:post異步上傳文件,提交分塊請(qǐng)求
     *
     * @param urlString     網(wǎng)絡(luò)地址
     * @param map           提交給服務(wù)器的表單信息鍵值對(duì)
     * @param files         提交的文件
     * @param formFieldName 每個(gè)需要提交的文件對(duì)應(yīng)的文件input的name值
     * @param callback      異步上傳回調(diào)方法
     * @throws IOException
     */
    public static void postUploadFilesAsync(Context context, String urlString, Map<String,
            String> map, File[] files, String[] formFieldName, Callback callback, Object tag)
            throws IOException {
        RequestBody requestBody = getOkHttpClientUtils(context).buildRequestBody(map, files,
                formFieldName);
        getOkHttpClientUtils(context).postRequestBodyAsync(urlString, requestBody, callback, tag);
    }

    ///////////////////////////////////////////////////////////////////////////
    // POST方式提交分塊請(qǐng)求袍祖,實(shí)現(xiàn)文件上傳
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 同步基于post的文件上傳:上傳多個(gè)文件以及攜帶key-value對(duì):主方法
     *
     * @param urlString
     * @param formFiledName
     * @param files
     * @param map
     * @param tag
     * @return String
     * @throws IOException
     */
    public static String postUploadFiles(Context context, String urlString, Map<String, String>
            map, File[] files, String[] formFiledName, Object tag) throws IOException {
        RequestBody requestBody = getOkHttpClientUtils(context).buildRequestBody(map, files,
                formFiledName);
        return getOkHttpClientUtils(context).postRequestBody(urlString, requestBody, tag);
    }

    /**
     * 創(chuàng)建post上傳附件的request對(duì)象
     * Post方式提交分塊請(qǐng)求——上傳文件及其它表單數(shù)據(jù)
     *
     * @param files
     * @param formFiledName
     * @param map
     * @return
     */
    private RequestBody buildRequestBody(Map<String, String> map, File[] files, String[]
            formFiledName) {
        MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
        //往MultipartBuilder對(duì)象中添加普通input控件的內(nèi)容
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                //添加普通input塊的數(shù)據(jù)
                builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + entry
                                .getKey() + "\""),
                        RequestBody.create(null, entry.getValue()));
            }
        }
        //往MultipartBuilder對(duì)象中添加file input控件的內(nèi)容
        if (files != null && formFiledName != null) {
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                String fileName = file.getName();
                RequestBody requestBody = RequestBody.create(MediaType.parse
                        ("multipart/form-data"), file);
                //添加file input塊的數(shù)據(jù)
                builder.addPart(Headers.of("Content-Disposition",
                        "form-data; name=\"" + formFiledName[i] + "\"; filename=\"" + fileName +
                                "\""), requestBody);
            }
        }
        //生成RequestBody對(duì)象
        return builder.build();
    }

    /**
     * 獲取Mime類型
     *
     * @param filename
     * @return
     */
    private static String getMimeType(String filename) {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String contentTypeFor = fileNameMap.getContentTypeFor(filename);
        if (contentTypeFor == null) {
            contentTypeFor = "application/octet-stream";
        }
        return contentTypeFor;
    }


    public static void cancelCall(Object tag) {
        getOkHttpSingletonInstance().cancel(tag);
    }

}

CSDN請(qǐng)移步到

http://blog.csdn.net/First_CooMan##

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末底瓣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蕉陋,更是在濱河造成了極大的恐慌捐凭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凳鬓,死亡現(xiàn)場(chǎng)離奇詭異茁肠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缩举,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門垦梆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仅孩,你說(shuō)我怎么就攤上這事托猩。” “怎么了辽慕?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵京腥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溅蛉,道長(zhǎng)公浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任船侧,我火速辦了婚禮欠气,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勺爱。我一直安慰自己晃琳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布琐鲁。 她就那樣靜靜地躺著卫旱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪围段。 梳的紋絲不亂的頭發(fā)上顾翼,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音奈泪,去河邊找鬼适贸。 笑死灸芳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拜姿。 我是一名探鬼主播烙样,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蕊肥!你這毒婦竟也來(lái)了谒获?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壁却,失蹤者是張志新(化名)和其女友劉穎批狱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展东,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赔硫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盐肃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪膊。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纽匙,死狀恐怖瞳收,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤处硬,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站拇派,受9級(jí)特大地震影響荷辕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜件豌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一疮方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茧彤,春花似錦骡显、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至珠洗,卻和暖如春溜歪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背许蓖。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工蝴猪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留调衰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓自阱,卻偏偏與公主長(zhǎng)得像嚎莉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沛豌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容