1. 程式人生 > >okHttp的封裝和攔截器

okHttp的封裝和攔截器

---------------------OkhttpUtils------------------------------

package com.ztz.mvpshopcart.okhttp;


import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

/**
 * Created by tr on 17/11/10.
 *
 * Okhttp 單例 範型的封裝
 */

public class OkhttpUtils {

    private static OkhttpUtils okhttpUtils = null ;

    private OkhttpUtils(){

    }

    public static OkhttpUtils getInstance(){

        if(okhttpUtils == null){
            okhttpUtils = new OkhttpUtils();
            client = new OkHttpClient.Builder()
                    .readTimeout(20, TimeUnit.SECONDS)
                    .writeTimeout(20,TimeUnit.SECONDS)
                    .connectTimeout(20,TimeUnit.SECONDS)
                    //新增攔截器
                    .addInterceptor(new LoggingInterceptor())
                    .build();
        }
        return okhttpUtils ;

    }
    private static OkHttpClient client ;

    /**
     * 發起非同步請求
     * @param params
     * @param url
     * @param callBack
     */
    public void asy(Map<String,String> params,String url,AbstractUiCallBack callBack){
        Request request = null ;

        if(params != null){
            // post 請求
            FormBody.Builder builder = new FormBody.Builder() ;
            for(Map.Entry<String,String> entry : params.entrySet()){
                builder.add(entry.getKey(),entry.getValue());
            }
            FormBody body =  builder.build();
            request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
        } else {
            // get 請求 --需要加請求頭可以在下方加

            request = new Request.Builder()

                    .url(url)
                    .build();
        }

        client.newCall(request).enqueue(callBack);

    }

    private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

    public static void postFile(Map<String,String> map, String url, File file,AbstractUiCallBack callBack){

        String [] array =  file.getAbsolutePath().split("\\/");

        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);

        for(Map.Entry<String,String> entry : map.entrySet()){
            builder.addFormDataPart(entry.getKey(),entry.getValue());
        }
        builder.addFormDataPart("imageFileName",array[array.length-1]);


        if(file.exists() && file.length() > 0){
            builder.addFormDataPart("image",array[array.length-1], RequestBody.create(MEDIA_TYPE_PNG,file));
        }
        MultipartBody body =  builder.build() ;

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        client.newCall(request).enqueue(callBack);
    }
}

---------------------AbstractUiCallBack------------------------------

package com.ztz.mvpshopcart.okhttp;

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

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * Created by tr on 17/11/10.
 *
 *  * Okhttp 單例 範型的封裝
 */

public  abstract  class AbstractUiCallBack<T> implements Callback {

    /**
     * 成功回撥
     * @param t
     */
    public abstract void success(T t);

    /**
     * 失敗回撥
     * @param e
     */
    public abstract void failure(Exception e);


    private Handler handler = null ;
    private Class clazz ;

    public AbstractUiCallBack(){
        handler = new Handler(Looper.getMainLooper());


        //  得到的是一個 AbstractUiCallBack<T> 的Type
       Type type =  getClass().getGenericSuperclass() ;

        // 得到的是T的實際Type
       Type [] arr =  ((ParameterizedType)type).getActualTypeArguments() ;

        clazz = (Class) arr[0] ;



    }




    @Override
    public void onFailure(Call call, IOException e) {

        failure(e);

    }

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


        try {
            String result = response.body().string();
            System.out.println("result = " + result);
            Gson gson = new Gson();

            final T t = (T) gson.fromJson(result,clazz);

            handler.post(new Runnable() {
                @Override
                public void run() {
                    success(t);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
            failure(e);
        } catch (JsonSyntaxException e) {
            e.printStackTrace();
            failure(e);
        }


    }
}

-------------------------------攔截器--------------------------------

package com.ztz.mvpshopcart.okhttp;

import java.io.IOException;

import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * 可以實現 新增公共請求引數
 */
public class LoggingInterceptor implements Interceptor {


  @Override public Response intercept(Chain chain) throws IOException {
    //首先取到Request
    Request request = chain.request();
    Response response = null;
    Request requestProcess = null ;
    if("GET".equals(request.method())){
      String url =  request.url().toString() + "&source=android";
      Request.Builder builder =  request.newBuilder() ;
      builder.get().url(url);
      requestProcess =  builder.build();
      response = chain.proceed(requestProcess);
    } else {
      FormBody.Builder builder = new FormBody.Builder() ;
      RequestBody requestBody =  request.body() ;
      if(requestBody instanceof FormBody){
        FormBody formBody = (FormBody)requestBody ;
        for (int i=0;i<formBody.size();i++){
          builder.add(formBody.encodedName(i),formBody.encodedValue(i));
        }
        builder.add("source","android");
      }
       requestProcess =  request.newBuilder().url(request.url().toString()).post(builder.build()).build() ;
      response = chain.proceed(requestProcess);
    }
    return response;
  }
}

相關推薦

okHttp封裝攔截

---------------------OkhttpUtils------------------------------ package com.ztz.mvpshopcart.okhttp; import java.io.File; import java.uti

VUE的axios對Promise的封裝攔截

const prod = process.env.NODE_ENV !== "development"; const root = prod ? "/root" : "/root"; const timeout = 60000; import axios

OkHttp中Interceptor攔截之公共引數請求封裝

前言 之前在面試的時候遇到這樣的一個問題,那就是如果app中所有的請求都要加入一些引數(例如 版本號、手機號、登入使用者名稱、token等。。。)那麼怎麼做才能實現,而不至於在每次請求的時候都去進行新增這些請求頭。其實這個問題,剛開始我是拒絕的(之前沒有遇到過

OkHttp二次封裝請求 攔截

1. 專案框架:必須使用MVP; 2. 圖片載入: Universal-Image-Loader或Glide圖片載入框架 3.網路載入框架:OkHttp,二次封裝,採用單例模式,自定義應用攔截器,封裝公共請求引數(注意:必須通過攔截器封裝公共請求引數,否則無法

(轉)過濾器攔截的區別

null req acc 編程 字符集 work uri indexof send 1、攔截器是基於java的反射機制的,而過濾器是基於函數回調 2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 3、攔截器只能對action請求起作用,而過濾器則可以對

監聽器攔截復習

index.jsp onf replace 客戶端 microsoft struts2 destroy 攔截器 servle 監聽器(Listener) 監聽器是一個接口,具體內容由我們來實現,監聽器的實現用了觀察者模式,我們實現的具體監聽器就是觀察者 JavaWeb中

struts執行過程攔截

strutsstruts執行過程和攔截器Struts2執行過程 Struts2攔截器概述1 struts2是框架,封裝了很多的功能,struts2裏面封裝的功能都是在攔截器裏面 2 struts2裏面封裝了很多的功能,有很多攔截器,不是每次這些攔截器都執行,每次執行默認的攔截器 3 struts2裏面默認攔截

過濾器攔截的區別

ros sof 多次 pan 圖片路徑 cti 攔截 mic -- ---------------------siwuxie095 過濾器和攔截器的區別 過濾器:過濾器理論上能過濾任何內容,如:HTML、JSP

struts2(三) 輸入校驗攔截

input 後綴名 轉換 erro ams 註釋 查找 一起 set       前面知道了struts2的架構圖和struts2的自動封裝表單參數和數據類型自動轉換,今天來學struts2的第三第四個東西,輸入校驗和攔截器,                       -

Java中過濾器攔截的區別

區別 對象 pos ava 初始 反射機制 action 調用 反射 1.攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2.過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3.攔截器只對action起作用,而過濾器幾乎可以對所有請求起作用

springBoot之配置文件的讀取以及過濾器攔截的使用

boolean nco 定義 www cheng handle mod HR out 前言 在之前的學習springBoot中,成功的實現了Restful風格的基本服務。但是想將之前的工程作為一個項目來說,那些是僅僅不夠的。可能還需要獲取自定義的配置以及添加過濾器和攔截器。

SpringMVC學習記錄七——sjon數據交互攔截

1.4 技術 nta app image 登陸 Go 文件 rest風格 21 json數據交互 21.1 為什麽要進行json數據交互 json數據格式在接口調用中、html頁面中較常用,json格式比較簡單,解析還比較方便。 比如:webservi

springboot環境下配置過濾器攔截

name public spring doc true 直接 war pattern long 以前我們在配置過濾器和攔截器的時候,都是一個類繼承一個接口,然後在xml中配置一下就ok 但是,但是,這是springboot的環境,沒有xml的配置。所以我們還要繼續學習啊啊

Okhttp的系統攔截

目錄 1.系統攔截器作用及執行順序 2.原始碼驗證執行順序 3.原始碼驗證各個攔截器的作用 1)RetryAndFollowUpInterceptor 2)BridgeInterceptor 3)CacheInterceptor 4)ConnectInterceptor

MyBatis學習——第四篇(攔截攔截分頁實現)

MyBatis架構體圖 1:mybatis核心物件 從MyBatis程式碼實現的角度來看,MyBatis的主要的核心部件有以下幾個: SqlSession         &n

Springboot中靜態資源攔截處理

背景: 在專案中我使用了自定義的Filter 這時候過濾了很多路徑,當然對靜態資源我是直接放過去的,但是,還是出現了靜態資源沒辦法訪問到springboot預設的資料夾中得檔案   說下預設對映的資料夾有: classpath:/META-INF/resourc

SpringBoot(十一)過濾器攔截

在做web開發的時候,過濾器(Filter)和攔截器(Interceptor)很常見,通俗的講,過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感詞彙。 過濾器依賴於servlet容器,

springboot(五)過濾器攔截

前言        過濾器和攔截器二者都是AOP程式設計思想的提現,都能實現諸如許可權檢查、日誌記錄等。二者有一定的相似之處,不同的地方在於: Filter是servlet規範,只能用在Web程式中,而攔截器是Spring規範,可以用在Web程式中,也可以用在

okHttp的日誌攔截

日誌攔截器的分類: a.網路攔截器 b.應用攔截器 建立一個類 /** * 日誌攔截器類,請求來了,先在這裡進行處理,可以得到發請求到得到請求消耗多久的時間 * 作用:可以排查網路請求速度慢的根本原因 * 1.有可能是我們在請求網路時,客戶端寫了一堆業務邏輯 * 2.有可能

轉發重定向的區別過濾器攔截的區別

spring width 客戶 截器 數據 http image 定向 框架 重定向:客戶端發起兩次請求 不會攜帶數據 轉發:服務端內部跳轉,從客戶端只發起一次請求 SpringMvc默認的跳轉方式是:轉發 SpringMvc中的攔截器:過濾進入SpringMVC