使用Retrofit打印請(qǐng)求日志,過(guò)濾改變服務(wù)器返回結(jié)果音比,直接獲取String字符串

Retrofit框架越來(lái)越流行了俭尖,Retrofit是基于OKHTTP的大家都知道,在之前的話,在Retrofit1.x的時(shí)候稽犁,是必須要自己手動(dòng)導(dǎo)入OKHTTP 和 OKio的包的焰望,因?yàn)镽etrofit依賴于這兩個(gè)庫(kù)的。但是自從升級(jí)了Retrofit2之后已亥,就可以不用手動(dòng)導(dǎo)入了熊赖,因?yàn)橐呀?jīng)自己引入了。

Retrofit有一個(gè)優(yōu)點(diǎn)虑椎,就是可以自動(dòng)根據(jù)獲取到的數(shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的Bean震鹉,它內(nèi)部提供了一個(gè)轉(zhuǎn)換機(jī)制,只需要你重寫捆姜,就能寫出自己的轉(zhuǎn)換規(guī)則传趾。

dependencies {
    compile 'com.squareup.retrofit2:retrofit:2.2.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.google.code.gson:gson:2.7'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    }

可以看到,我上面引入了Retrofit2的庫(kù)

compile 'com.squareup.retrofit2:retrofit:2.2.0'
但是除了這個(gè)份之外泥技,我還引入了其他的浆兰。

這兩個(gè),是在從請(qǐng)求Json數(shù)據(jù)到Bean需要使用到的珊豹。依賴了谷歌的Gson庫(kù)

compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.google.code.gson:gson:2.7'

直接獲取字符串手動(dòng)解析

除了這種情況簸呈,我們經(jīng)常會(huì)因?yàn)楹笈_(tái)傳來(lái)的數(shù)據(jù)的不穩(wěn)定性,我們需要自己手動(dòng)去解析字符串平夜,那么就引入了這個(gè)
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'

使用方式好簡(jiǎn)單:

new Retrofit.Builder()  //01:獲取Retrofit對(duì)象
.baseUrl(Globals.SERVER_ADDRESS) //02采用鏈?zhǔn)浇Y(jié)構(gòu)綁定Base url
.addConverterFactory(ScalarsConverterFactory.create())//首先判斷是否需要轉(zhuǎn)換成字符串蝶棋,簡(jiǎn)單類型
.addConverterFactory(GsonConverterFactory.create())//再將轉(zhuǎn)換成bean
.client(okHttpClient)
.build();//03執(zhí)行操作
public interface StartPageNet
{
    @GET("hao123-soft-online-bcs/soft/2017_02_22_W.P.S.5041.19.552.exe")
    public Call<String> getIndex();
}

首先在這里定義卸亮,Call<String> 里的泛型可以寫這幾種類型:

if (type == String.class
        || type == boolean.class
        || type == Boolean.class
        || type == byte.class
        || type == Byte.class
        || type == char.class
        || type == Character.class
        || type == double.class
        || type == Double.class
        || type == float.class
        || type == Float.class
        || type == int.class
        || type == Integer.class
        || type == long.class
        || type == Long.class
        || type == short.class
        || type == Short.class) {
      return ScalarRequestBodyConverter.INSTANCE;
    }

這里會(huì)自動(dòng)根據(jù)返回?cái)?shù)據(jù)轉(zhuǎn)換成你泛型里寫的類型的數(shù)據(jù)忽妒。

 StartPageNet startPageNet = streamRetrofit.create(StartPageNet.class);
 Call<String> download = startPageNet.getIndex();
 download.enqueue(new Callback<String>()
 {
     @Override
     public void onResponse(Call<String> call, Response<String> response)
     {
         String result = response.body();
     }
     @Override
     public void onFailure(Call<String> call, Throwable t)
     {

     }
});

查看Retrofit請(qǐng)求網(wǎng)絡(luò)日志

有時(shí)候需要隨時(shí)查看網(wǎng)絡(luò)請(qǐng)求日志,我們這里可以利用OKHttpInterceptor機(jī)制
上面我們引入了這個(gè)庫(kù):
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

使用代碼如下:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger()
{
     @Override
     public void log(String message) 
     {
         if (BuildConfig.DEBUG) Log.d("Http", message+"");
     }
});
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//設(shè)置日志打印等級(jí)
        
 OkHttpClient  okHttpClient = new OkHttpClient.Builder()             
         .addInterceptor(loggingInterceptor)//設(shè)置日志打印
         .retryOnConnectionFailure(true)//失敗重連
         .connectTimeout(30, TimeUnit.SECONDS)//網(wǎng)絡(luò)請(qǐng)求超時(shí)時(shí)間單位為秒
         .build();

.addInterceptor()可以調(diào)用多次

自定義Interceptor實(shí)現(xiàn)過(guò)濾改變請(qǐng)求返回的數(shù)據(jù)(可使用與保證APP的穩(wěn)定性)

import com.alibaba.fastjson.JSON;

import java.io.ByteArrayInputStream;
import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.BufferedSource;
import okio.Okio;

/**
 * 網(wǎng)絡(luò)請(qǐng)求的攔截器
 * Created by xiaolei on 2017/3/2.
 */

public class SessionInterceptor implements Interceptor
{
    @Override
    public Response intercept(Chain chain) throws IOException
    {
        Request request = chain.request();
        Response response = chain.proceed(request);
        return new Response.Builder()
                .body(newResponseBody(response))
                .headers(response.headers())
                .message(response.message())
                .code(response.code())
                .request(response.request())
                .protocol(response.protocol())
                .build();
    }
    private ResponseBody newResponseBody(final Response response)
    {
        return new ResponseBody()
        {
            @Override
            public MediaType contentType()
            {
                return response.body().contentType();
            }
            @Override
            public long contentLength()
            {
                return response.body().contentLength();
            }
            @Override
            public BufferedSource source()
            {
                try
                {
                    String result = response.body().string();
                    if(JSON.parseObject(result).getInteger("code") == 500)
                    {
                        /**
                        *這里改變返回的數(shù)據(jù)兼贸,如果服務(wù)器返回的是一個(gè)HTML網(wǎng)頁(yè)段直,
                        *那么移動(dòng)端也能拿到一個(gè)Json數(shù)據(jù),用于保證數(shù)據(jù)可解析不至于崩潰
                        */
                        ByteArrayInputStream tInputStringStream = new ByteArrayInputStream("{code:500,success:false}".getBytes());
                        BufferedSource source = Okio.buffer(Okio.source(tInputStringStream));
                        return source;
                    }else
                    {
                        ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(result.getBytes());
                        BufferedSource source = Okio.buffer(Okio.source(tInputStringStream));
                        return source;
                    }
                } catch (IOException e)
                {
                    e.printStackTrace();
                    return null;
                }
            }
        };
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溶诞,一起剝皮案震驚了整個(gè)濱河市鸯檬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螺垢,老刑警劉巖喧务,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異枉圃,居然都是意外死亡功茴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門孽亲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坎穿,“玉大人,你說(shuō)我怎么就攤上這事×崦粒” “怎么了栖茉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)孵延。 經(jīng)常有香客問(wèn)我吕漂,道長(zhǎng),這世上最難降的妖魔是什么尘应? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任痰娱,我火速辦了婚禮,結(jié)果婚禮上菩收,老公的妹妹穿的比我還像新娘梨睁。我一直安慰自己,他們只是感情好娜饵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布坡贺。 她就那樣靜靜地躺著,像睡著了一般箱舞。 火紅的嫁衣襯著肌膚如雪遍坟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天晴股,我揣著相機(jī)與錄音愿伴,去河邊找鬼。 笑死电湘,一個(gè)胖子當(dāng)著我的面吹牛隔节,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寂呛,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怎诫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贷痪?” 一聲冷哼從身側(cè)響起幻妓,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劫拢,沒(méi)想到半個(gè)月后肉津,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舱沧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年妹沙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狗唉。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡初烘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肾筐,我是刑警寧澤哆料,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站吗铐,受9級(jí)特大地震影響东亦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唬渗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一典阵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镊逝,春花似錦壮啊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至座菠,卻和暖如春狸眼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浴滴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工拓萌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人升略。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓微王,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親降宅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骂远,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評(píng)論 25 707
  • 一囚霸、簡(jiǎn)介 Retrofit是Square公司開(kāi)發(fā)的一款針對(duì)Android網(wǎng)絡(luò)請(qǐng)求的框架腰根,Retrofit2底層基于...
    Devil不加V閱讀 547評(píng)論 0 0
  • Retrofit用法詳解 一、簡(jiǎn)介 Retrofit是Square公司開(kāi)發(fā)的一款針對(duì)Android網(wǎng)絡(luò)請(qǐng)求的框架拓型,...
    流水潺湲閱讀 852評(píng)論 0 6
  • Retrofit是squareup公司的開(kāi)源力作劣挫,和同屬squareup公司開(kāi)源的OkHttp册养,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)調(diào)度,...
    藍(lán)灰_q閱讀 41,473評(píng)論 23 281
  • 回學(xué)校一個(gè)多月了压固,是想寫點(diǎn)什么記錄下我最后的校園時(shí)光球拦。 還記得在大一入學(xué)的時(shí)候,軍訓(xùn)完之后我們有一天晚上我們?cè)诮淌?..
    野孩子阿西閱讀 202評(píng)論 0 0