retrofit 2.0+okHttp3.9添加公共參數(shù)【史上支持最全get厂抽、post(Filed、Part丁眼、PartMap)】

目前網(wǎng)上最多的添加公共參數(shù)的就是簡(jiǎn)單的get筷凤、與post表單FormBody的公共參數(shù)的方法,當(dāng)遇到一個(gè)請(qǐng)求體中有多個(gè)requestBody的時(shí)候苞七,這時(shí)候就不管用藐守。如圖:

Paste_Image.png

解決方案如下:

Paste_Image.png

代碼見(jiàn):

import android.util.Log;
import com.windfindtech.icommon.iCommon;
import com.windfindtech.icommon.util.Utils;
import java.io.IOException;
import java.util.List;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.RequestBody;
import okio.Buffer;

/** 后續(xù)所有的網(wǎng)絡(luò)相關(guān)公共參數(shù)以及緩存配置可以在該類(lèi)實(shí)現(xiàn)
 * Created by hq on 2017/9/12.
 */

public class LogInterceptor implements Interceptor {

public static String TAG = "LogInterceptor";

@Override
public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
    Request oldRequest = chain.request();
    Request.Builder newRequestBuild=null;
    String method = oldRequest.method();
    String postBodyString="";
    if("POST".equals(method)){
        RequestBody oldBody = oldRequest.body();
        if(oldBody instanceof FormBody){
            FormBody.Builder formBodyBuilder = new FormBody.Builder();
            formBodyBuilder.add("deviceOs", iCommon.DEVICE_OS);
            formBodyBuilder.add("appVersion", Utils.instance().getAppVersionName());
            formBodyBuilder.add("appName", Utils.instance().getAppNameNew());
            newRequestBuild = oldRequest.newBuilder();

            RequestBody formBody = formBodyBuilder.build();
            postBodyString = bodyToString(oldRequest.body());
            postBodyString += ((postBodyString.length() > 0) ? "&" : "") + bodyToString(formBody);
            newRequestBuild.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"), postBodyString));
        }else if(oldBody instanceof MultipartBody){
            MultipartBody oldBodyMultipart = (MultipartBody)oldBody;
            List<MultipartBody.Part> oldPartList = oldBodyMultipart.parts();
            MultipartBody.Builder builder = new MultipartBody.Builder();
            builder.setType(MultipartBody.FORM);
            RequestBody requestBody1 = RequestBody.create(MediaType.parse("text/plain"), iCommon.DEVICE_OS);
            RequestBody requestBody2 = RequestBody.create(MediaType.parse("text/plain"), Utils.instance().getAppNameNew());
            RequestBody requestBody3 = RequestBody.create(MediaType.parse("text/plain"), Utils.instance().getAppVersionName());
            for (MultipartBody.Part part:oldPartList) {
                builder.addPart(part);
                postBodyString += (bodyToString(part.body()) + "\n");
            }
            postBodyString += (bodyToString(requestBody1) + "\n");
            postBodyString += (bodyToString(requestBody2) + "\n");
            postBodyString += (bodyToString(requestBody3) + "\n");
//              builder.addPart(oldBody);  //不能用這個(gè)方法,因?yàn)椴恢纎ldBody的類(lèi)型蹂风,可能是PartMap過(guò)來(lái)的卢厂,也可能是多個(gè)Part過(guò)來(lái)的,所以需要重新逐個(gè)加載進(jìn)去
            builder.addPart(requestBody1);
            builder.addPart(requestBody2);
            builder.addPart(requestBody3);
            newRequestBuild = oldRequest.newBuilder();
            newRequestBuild.post(builder.build());
            Log.e(TAG,"MultipartBody,"+oldRequest.url());
        }else{
            newRequestBuild = oldRequest.newBuilder();
        }
    }else {
        // 添加新的參數(shù)
        HttpUrl.Builder commonParamsUrlBuilder = oldRequest.url()
            .newBuilder()
            .scheme(oldRequest.url().scheme())
            .host(oldRequest.url().host())
            .addQueryParameter("deviceOs", iCommon.DEVICE_OS)
            .addQueryParameter("appVersion", Utils.instance().getAppVersionName())
            .addQueryParameter("appName", Utils.instance().getAppNameNew());
        newRequestBuild = oldRequest.newBuilder()
            .method(oldRequest.method(), oldRequest.body())
            .url(commonParamsUrlBuilder.build());
    }
    Request newRequest = newRequestBuild
        .addHeader("Accept", "application/json")
        .addHeader("Accept-Language", "zh")
        .build();

    long startTime = System.currentTimeMillis();
    okhttp3.Response response = chain.proceed(newRequest);
    long endTime = System.currentTimeMillis();
    long duration = endTime - startTime;
    okhttp3.MediaType mediaType = response.body().contentType();
    String content = response.body().string();
    int httpStatus = response.code();
    StringBuilder logSB = new StringBuilder();
    logSB.append("-------start:"+method+"|");
    logSB.append(newRequest.toString()+"\n|");
    logSB.append(method.equalsIgnoreCase("POST")?"post參數(shù){"+ postBodyString +"}\n|":"");
    logSB.append("httpCode=" + httpStatus + ";Response:" + content+"\n|");
    logSB.append("----------End:" + duration + "毫秒----------");
    Log.d(TAG,logSB.toString());
    return response.newBuilder()
        .body(okhttp3.ResponseBody.create(mediaType, content))
        .build();
}
private static String bodyToString(final RequestBody request) {
    try {
        final RequestBody copy = request;
        final Buffer buffer = new Buffer();
        if (copy != null)
            copy.writeTo(buffer);
        else
            return "";
        return buffer.readUtf8();
    } catch (final IOException e) {
        return "did not work";
    }
}
}

使用方法(將攔截器添加到OkHttpClient中):

OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.retryOnConnectionFailure(false)
        .cookieJar(s_cookieJar)
        .connectTimeout(DEFAULT_NETWORK_TIMEOUT, TimeUnit.MILLISECONDS)
        .readTimeout(DEFAULT_NETWORK_TIMEOUT, TimeUnit.MILLISECONDS)
        .writeTimeout(DEFAULT_NETWORK_TIMEOUT, TimeUnit.MILLISECONDS)
        .addInterceptor(new LogInterceptor());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惠啄,一起剝皮案震驚了整個(gè)濱河市慎恒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撵渡,老刑警劉巖融柬,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趋距,居然都是意外死亡粒氧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)节腐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)靠欢,“玉大人,你說(shuō)我怎么就攤上這事铜跑∶殴郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锅纺,是天一觀的道長(zhǎng)掷空。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么坦弟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任护锤,我火速辦了婚禮,結(jié)果婚禮上酿傍,老公的妹妹穿的比我還像新娘烙懦。我一直安慰自己,他們只是感情好赤炒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布氯析。 她就那樣靜靜地躺著,像睡著了一般莺褒。 火紅的嫁衣襯著肌膚如雪掩缓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天遵岩,我揣著相機(jī)與錄音你辣,去河邊找鬼。 笑死尘执,一個(gè)胖子當(dāng)著我的面吹牛舍哄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播誊锭,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼表悬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炉旷?” 一聲冷哼從身側(cè)響起签孔,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叉讥,失蹤者是張志新(化名)和其女友劉穎窘行,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體图仓,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罐盔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了救崔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶看。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖六孵,靈堂內(nèi)的尸體忽然破棺而出纬黎,到底是詐尸還是另有隱情,我是刑警寧澤劫窒,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布本今,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冠息。R本人自食惡果不足惜挪凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逛艰。 院中可真熱鬧躏碳,春花似錦、人聲如沸散怖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杭抠。三九已至脸甘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偏灿,已是汗流浹背丹诀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翁垂,地道東北人铆遭。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沿猜,于是被迫代替她去往敵國(guó)和親枚荣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理啼肩,服務(wù)發(fā)現(xiàn)橄妆,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 參考Android網(wǎng)絡(luò)請(qǐng)求心路歷程Android Http接地氣網(wǎng)絡(luò)請(qǐng)求(HttpURLConnection) 一...
    合肥黑閱讀 21,276評(píng)論 7 63
  • Retrofit 實(shí)際上并不能說(shuō)是一個(gè)網(wǎng)絡(luò)請(qǐng)求框架祈坠,它其實(shí)是對(duì) okHttp 這個(gè)網(wǎng)絡(luò)請(qǐng)求框架在接口層面的封裝害碾,網(wǎng)...
    EmanLu閱讀 1,046評(píng)論 0 2
  • 前一篇文章(也是我在簡(jiǎn)書(shū)上的第一篇技術(shù)文章.)講了Android三劍客的基礎(chǔ)用法和簡(jiǎn)單封裝,有一些封裝只是一筆帶過(guò)...
    小楓閱讀 14,262評(píng)論 9 82
  • Github地址---MyOkhttpUtils 初衷 對(duì)于okhttp3出來(lái)以后赦拘,使用的都是網(wǎng)上封裝好的庫(kù)慌随,為了...
    iam薛定諤閱讀 6,841評(píng)論 1 13