Retrofit 2.0 詳解(三)報(bào)文加解密 攔截器(Interceptor)

前面已經(jīng)講了
Retrofit 2.0 詳解(一)基本用法
Retrofit 2.0 詳解(二)加載https請(qǐng)求

接下來(lái)我們講解一下怎么通過(guò)Retrofit 來(lái)個(gè)傳輸中的報(bào)文加密莫鸭,老規(guī)矩选侨,還是先寫Service接口

    @POST("NewsServlet")
    Observable<String> testInterceptor(@Body News news);

關(guān)鍵點(diǎn)就是怎么把news這個(gè)對(duì)象的json字符串加密追他,那就需要用到攔截器了Interceptor菩浙,不知道的老鐵還是自行百度吧狂秦,下面咱們看下怎么通過(guò)Interceptor來(lái)給報(bào)文加解密的。

第一步蜻展,就要實(shí)現(xiàn)Interceptor接口锥忿,重寫Response intercept(Chain chain)方法
public class EncryptInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        //這個(gè)是請(qǐng)求的url虚吟,也就是咱們前面配置的baseUrl
        String url = request.url().toString();
        //這個(gè)是請(qǐng)求方法
        String method = request.method();
        long t1 = System.nanoTime();
        request = encrypt(request);//模擬的加密方法
        Response response = chain.proceed(request);
        long t2 = System.nanoTime();
        response = decrypt(response);
        return response;
    }
}

下面咱們看下加密方法是怎么寫的

    //加密
    private Request encrypt(Request request) throws IOException {
        //獲取請(qǐng)求body寸认,只有@Body 參數(shù)的requestBody 才不會(huì)為 null
        RequestBody requestBody = request.body();
        if (requestBody != null) {
            okio.Buffer buffer = new okio.Buffer();
            requestBody.writeTo(buffer);
            Charset charset = Charset.forName("UTF-8");
            MediaType contentType = requestBody.contentType();
            if (contentType != null) {
                charset = contentType.charset(charset);
            }
            
            String string = buffer.readString(charset);
            //模擬加密的方法,這里調(diào)用大家自己的加密方法就可以了
            String encryptStr = encrypt(string);
                RequestBody body = MultipartBody.create(contentType, encryptStr);
                request = request.newBuilder()
                        .post(body)
                        .build();
            
        }
        return request;
    }

咱們看下String string = buffer.readString(charset);這個(gè)string讀出來(lái)的是什么

{"comments":[],"date":"20170619","id":1,"likes":"likes","title":"Converter用法3","views":"views"}

其實(shí)就是把news轉(zhuǎn)換成了json字符串

下面看下我隨便寫的加密方法串慰,前面隨便加個(gè)"我是密文:"

    //模擬加密的方法
    private String encrypt(String string) {
        return "我是密文:" + string;
    }

在看下服務(wù)器收到的報(bào)文

我是密文:{"comments":[],"date":"20170619","id":1,"likes":"likes","title":"Converter用法3","views":"views"}

下面就是服務(wù)解密做邏輯處理了偏塞,做完處理服務(wù)器在給客戶端響應(yīng)的時(shí)候也續(xù)要加密返回和客戶端,下面來(lái)看下客戶端是怎么解密的

    private Response decrypt(Response response) throws IOException {
        if (response.isSuccessful()) {
            //the response data
            ResponseBody body = response.body();
            BufferedSource source = body.source();
            source.request(Long.MAX_VALUE); // Buffer the entire body.
            Buffer buffer = source.buffer();
            Charset charset = Charset.defaultCharset();
            MediaType contentType = body.contentType();
            if (contentType != null) {
                charset = contentType.charset(charset);
            }
            String string = buffer.clone().readString(charset);
            //解密方法邦鲫,需要自己去實(shí)現(xiàn)
            String bodyString = decrypt(string);
            ResponseBody responseBody = ResponseBody.create(contentType, bodyString);
            response = response.newBuilder().body(responseBody).build();
        }
        return response;
    }

后來(lái)響應(yīng)的報(bào)文

我是密文:{"comments":[],"date":"20170619","id":1,"likes":"likes","title":"Converter用法3","views":"views"}

我這邊的解密方法和也很簡(jiǎn)單

    //模擬解密的方法
    private String decrypt(String string) {
        if (string != null && string.length() != 0) {
            string.replace("我是密文:", "");
        }
        return string;
    }
第二步添加Interceptor
 OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
 builder.addInterceptor(new EncryptInterceptor());
 Retrofit retrofit = new Retrofit.Builder()
         .baseUrl(baseUrl)
         .addConverterFactory(ScalarsConverterFactory.create())
         //可以接收自定義的Gson灸叼,當(dāng)然也可以不傳
         .addConverterFactory(GsonConverterFactory.create(gson))
         // 針對(duì)rxjava2.x
         .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
         .client(builder.build())
         .build();
第三步 調(diào)用
NewsService newsService = createRetrofit().create(NewsService.class);
News news = new News();
news.likes = "likes";
news.date = "20170619";
news.title = "Converter用法3";
news.id = 1;
news.views = "views";
Observable<String> observable =  newsService.testInterceptor(news);
observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {
    }
    @Override
    public void onNext(String value) {
        Log("Scalar用法 onNext value:" + value);
    }
    @Override
    public void onError(Throwable e) {
        Log("Scalar用法 onError " + e.getMessage());
        e.printStackTrace();
    }
    @Override
    public void onComplete() {
    }
});

這樣就完成了加密解密了,外面調(diào)用不用關(guān)心里面的加密解密邏輯庆捺,只需要按照以前的邏輯開發(fā)就可以了古今。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滔以,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子你画,更是在濱河造成了極大的恐慌抵碟,老刑警劉巖立磁,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呈队,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宪摧,警方通過(guò)查閱死者的電腦和手機(jī)粒竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蕊苗,“玉大人,你說(shuō)我怎么就攤上這事朽砰〖夤觯” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瞧柔,是天一觀的道長(zhǎng)漆弄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)造锅,這世上最難降的妖魔是什么撼唾? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮哥蔚,結(jié)果婚禮上倒谷,老公的妹妹穿的比我還像新娘。我一直安慰自己糙箍,他們只是感情好渤愁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倍靡,像睡著了一般猴伶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塌西,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天他挎,我揣著相機(jī)與錄音,去河邊找鬼捡需。 笑死办桨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的站辉。 我是一名探鬼主播呢撞,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饰剥!你這毒婦竟也來(lái)了殊霞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汰蓉,失蹤者是張志新(化名)和其女友劉穎绷蹲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祝钢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年比规,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦英。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜒什,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疤估,到底是詐尸還是另有隱情灾常,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布铃拇,位于F島的核電站岗憋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锚贱。R本人自食惡果不足惜仔戈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一拧廊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吧碾,春花似錦、人聲如沸倦春。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呢堰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枉疼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工骂维, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人航闺。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汰扭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子福铅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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